2012-02-09 28 views
5

Mam plik, który zawiera pewną liczbę wierszy o stałej długości z pewnymi liczbami. Muszę przeczytać każdy wiersz, aby uzyskać ten numer i przetworzyć je i napisać do pliku. Ponieważ muszę przeczytać każdy wiersz, ponieważ zwiększa się liczba wierszy, staje się czasochłonne.Najbardziej efektywny sposób odczytu pliku

Czy istnieje skuteczny sposób czytania każdego wiersza pliku? Używam C#.

+4

Należy do StackOverflow. –

+0

Czy korzystasz z wersji 4.0 lub 2/3.5? –

Odpowiedz

0

Odczyt wszystkich wierszy z pliku jest zawsze co najmniej O (n). Kiedy rozmiar pliku zaczyna stawać się problemem, prawdopodobnie jest to dobry moment, aby spojrzeć na tworzenie bazy danych dla informacji zamiast plików płaskich.

+0

cóż, pliki są wynikiem zewnętrznego sprzętu, który będzie miał postać plików i faktycznie dużej liczby plików .... jakikolwiek sposób sprawnego odczytu plików byłby doceniany – Jay

14

File.ReadLines (.NET 4.0+) jest prawdopodobnie najbardziej wydajną pod tym względem pamięcią.

Zwraca numer IEnumerable<string>, co oznacza, że ​​linie będą leniwie czytane strumieniowo.

Poprzednie wersje nie udostępniają opcji przesyłania strumieniowego w ten sposób, ale użycie StreamReader do czytania linii po linii osiągnie to samo.

+1

Jest to dostępne tylko w .NET 4 lub większy. Po prostu coś do wskazania, nie jestem pewien, co używa OP. –

+0

@AaronMcIver - Dobra uwaga. Odpowiedź zaktualizowana. – Oded

+0

Byłem dość pewny, że użyłem tego w 3.5, może to być File.ReadAllText, który zwraca String Array – Venki

0

Nie jestem pewien, że jest to najbardziej skuteczny, ale działa dobrze dla mnie: http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

//Declare a new file and give it the path to your file 
    FileInfo fi1 = new FileInfo(path); 

    //Open the file and read the text 
    using (StreamReader sr = fi1.OpenText()) 
    { 
     string s = ""; 
     // Loop through each line 
     while ((s = sr.ReadLine()) != null) 
     { 
      //Here is where you handle your row in the file 
      Console.WriteLine(s); 
     } 
    } 
+0

To, co robię po tym, zamiast po prostu zapisać linię na konsoli, zamienia linię na tablicę i importuje dane do tabeli bazy danych. Wydaje się, że działa bardzo szybko poprzez plik rozdzielany tabulatorami, ale prawie nigdy nie muszę przechodzić z nim więcej niż kilka tysięcy rekordów. –

+0

Jeśli nie robisz czegoś specjalnego z StreamReaderem, którego w tym przykładzie nie masz, możesz po prostu napisać foreach (wiersz var w File.ReadLines (path)) {Console.WriteLine (linia); } '. – Philip

0

Bez względu na to, jaki system operacyjny używasz, będzie kilka warstw między kodem a rzeczywistym przechowywania mechanizm. Dyski twarde i napędy taśmowe przechowują pliki w blokach, które obecnie mają zwykle około 4K każdy. Jeśli chcesz przeczytać jeden bajt, urządzenie nadal będzie czytało cały blok w pamięci - po prostu jest to szybsze. Urządzenie i system operacyjny mogą również przechowywać pamięć podręczną bloków. Tak więc niewiele można zrobić, aby zmienić standardowe (wysoce zoptymalizowane) zachowanie odczytu pliku; po prostu przeczytaj plik, gdy go potrzebujesz i pozwól, aby system zajął się resztą.

Jeśli czas przetworzyć plik staje się problemem, dwie opcje, które mogą pomóc to:

  1. spróbować zorganizować używać krótszych plików. Wygląda na to, że przetwarzasz pliki dzienników lub coś takiego - częstsze uruchamianie programu może sprawić, że przynajmniej uzyskasz lepszą wydajność.

  2. Zmień sposób przechowywania danych. Ponownie, rozumiem, że plik pochodzi z jakiegoś zewnętrznego źródła, ale być może uda ci się uruchomić zadanie, które okresowo konwertuje plik raw na coś, co możesz przeczytać szybciej.

Powodzenia.

Powiązane problemy