Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Считать файл построчно Добавлено: 16.04.09 22:46  

Автор вопроса:  maza_____ | Web-сайт: vkontakte.ru/id25563295 добавляйтесь в друзья)) | ICQ: 9968842 
Подскажите плиз.Как считать текст из файла построчно и засунуть в массив

Ответить

  Ответы Всего ответов: 9  

Номер ответа: 1
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #1
Добавлено: 16.04.09 23:00
  1. Imports System.IO
  2.  
  3. Module Module1
  4.  
  5.     Sub Main()
  6.         Dim d_List As New List(Of String)
  7.         Using d_SR As New StreamReader("D:\1.txt")
  8.             Do Until d_SR.EndOfStream
  9.                 d_List.Add(d_SR.ReadLine)
  10.             Loop
  11.         End Using
  12.         For Each d_Line As String In d_List
  13.             Console.WriteLine(d_Line)
  14.         Next
  15.  
  16.         Console.Read()
  17.     End Sub
  18.  
  19. End Module

Только я использовал Лист... для удобства :)

Ответить

Номер ответа: 2
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #2 Добавлено: 17.04.09 00:24
__Pavel__, ты специально всех в заблуждение вводишь своими ответами или просто сам нифига не знаешь?

maza_^, юзай File.ReadAllLines он вернет тебе уже готовый массив строк. 1 строка кода всего делов...

Ответить

Номер ответа: 3
Автор ответа:
 maza_____



ICQ: 9968842 

Вопросов: 40
Ответов: 337
 Web-сайт: vkontakte.ru/id25563295 добавляйтесь в друзья))
 Профиль | | #3
Добавлено: 17.04.09 12:23
EROS спасибо:)

Ответить

Номер ответа: 4
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #4
Добавлено: 17.04.09 19:41
А если нужно построчно считывать и тут же проверять или еще чего делать? Ведь не зря в вопросе спрашивалось именно построчно!

А если честно, то не знал :) спс за еще один метод... а не знаю, т.к. никогда не требовалось считывать текстовый документ в массив... я вообще даже представить не могу зачем это нужно??? Вау! У меня массив на 10Гб в ОЗУ... щас я его проверю!!! Да? Не легче считывать по одной строчке и проверять... Ох чую что-то здесь неладно...

Ответить

Номер ответа: 5
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #5
Добавлено: 17.04.09 21:45
Итак... решил протестировать скорость работы обоих алгоритмов и выяснилось следующее...
Тестил я на двух файлах 60МБ и 1ГБ, состоящих из строк "0000000000"
Допустим ситуация такая... решили загрузить массив только для проверки, т.е. нужно просто проверить каждую строку из файла размером 1ГБ:
  1. Imports System.IO
  2.  
  3. Module Module1
  4.  
  5.     Sub Main()
  6.         Dim t1 As Date
  7.         Dim t2 As Date
  8.         'мой метод
  9.         t1 = Now
  10.         Using d_SR As New StreamReader("D:\1.txt")
  11.             Do Until d_SR.EndOfStream
  12.                 d_SR.ReadLine() 'тут чего нибудь делаем со считываемым значением
  13.             Loop
  14.         End Using
  15.         t2 = Now
  16.         Console.WriteLine(t2.Ticks - t1.Ticks)
  17.         'метод EROS
  18.         t1 = Now
  19.         Dim d() As String = File.ReadAllLines("D:\1.txt") 'тут копаем могилу компу =)
  20.         t2 = Now
  21.         Console.WriteLine(t2.Ticks - t1.Ticks)
  22.         '-------------------------------------------
  23.         Console.ReadKey()
  24.     End Sub
  25.  
  26. End Module

Итог можно узнать по комментариям... Для файла размером в 60МБ мой вариант работает почти в 3 раза быстрей!!!
Итак допустим нужно все же получить массив данных:
  1. Imports System.IO
  2.  
  3. Module Module1
  4.  
  5.     Sub Main()
  6.         Dim t1 As Date
  7.         Dim t2 As Date
  8.         'мой метод
  9.         t1 = Now
  10.         Dim d_List As New List(Of String)
  11.         Using d_SR As New StreamReader("D:\2.txt")
  12.             Do Until d_SR.EndOfStream
  13.                 d_List.Add(d_SR.ReadLine)
  14.             Loop
  15.         End Using
  16.         t2 = Now
  17.         Console.WriteLine(t2.Ticks - t1.Ticks)
  18.         'метод EROS
  19.         t1 = Now
  20.         Dim d() As String = File.ReadAllLines("D:\2.txt")
  21.         t2 = Now
  22.         Console.WriteLine(t2.Ticks - t1.Ticks)
  23.         '-------------------------------------------
  24.         Console.ReadKey()
  25.     End Sub
  26.  
  27. End Module

Т.к. List тот же массив, на это не обращаем внимания :), но мой вариант опять же быстрее... при файле 60МБ, при файле 1ГБ в обоих случаях яма... по понятным причинам :)

Вот вам и 1 строчка кода :)

Ответить

Номер ответа: 6
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #6 Добавлено: 18.04.09 22:13
))) улыбнуло...
Ты, наверное, наивно полагаешь, что ты для меня америку открыл? )))) Я этим способом пользовался еще 2002 году, пока ты в подгузники гадил ))))
Во-первых, какому идиоту придет в голову держать 60 метров(а тем более 1ГБ) в текстовом файле и читать их все сразу в память?
Во-вторых, в 99% случаях текстовый файл - это максимум 1МБ.. а то и гораздо меньше.. сотня - другая килобайт... а на таких объемах данных разница в скорости если и будет, то она будет намного меньше скорости доступа к HDD
в-третьих, если бы ты был немного поумнее и поопытнее,то вместо того,чтобы гнуть тут пальцы и кидать дешевые понты, ты взял бы в руки декомпилятор, и ковырнул им ReadAllLines.. Там бы ты увидел следующее:
  1.  
  2. public static string[] ReadAllLines(string path, Encoding encoding)
  3. {
  4.     ArrayList list = new ArrayList();
  5.     using (StreamReader reader = new StreamReader(path, encoding))
  6.     {
  7.         string str;
  8.         while ((str = reader.ReadLine()) != null)
  9.         {
  10.             list.Add(str);
  11.         }
  12.     }
  13.     return (string[]) list.ToArray(typeof(string));
  14. }


Ничего не напоминает,нет??? Судя по коду, ты делаешь тоже самое... так что результаты своего теста можешь засунуть сам знаешь куда...
  
Ну и из всего вышесказанного следует сделать вывод, что выигрых в скорости от твоего кода на реальных, а не на академических, задачах будет составлять стопиццот микросекунд,что есть ничтожно мало чтобы его использовать. Будем продолжать дискуссию или ты все понял?

Вот вам и 1 строчка кода

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 18.04.09 23:42
__Pavel__ пишет:
Т.к. List тот же массив, на это не обращаем внимания , но мой вариант опять же быстрее... при файле 60МБ, при файле 1ГБ в обоих случаях яма... по понятным причинам

Паша, пожалуйста, поясни нам эти самые... "понятные причины"!

Хинт - я запустил ТВОЙ код который загружает данные в List на файле размером 1.2 ГБ, хранящим строчки "0000000000" и за 20 минут не дождался когда же данные будут загружены.
(хинт - у меня на компьютере 6 гигабайт оперативной памяти, а файл подкачки имеет возможность разрастись до нескольких сотен гигабайт если это потребуется). Тем не менее я не дождался окончания загрузки (больше 20 минут ждал, потом выключил). Пояснишь нам в чем именно затык?

Далее разбор кодов. Как ни странно, лажи коде нет. Тот факт что первый бенчмарк показывает преимущество твоего кода не говорит ровным счетом ни о чем - потому что у тебя не выполняется выделение памяти.

По поводу второго бенчмарка. Твой код определенно показывает примерно 7% выигрыш перед кодом который предоставил EROS.
В чем же проблема? Да ты и сам прекрасно знаешь в чем она, и даже указал мне на нее.
> Т.к. List тот же массив, на это не обращаем внимания
Понимаешь, List это List. А массив - это массив. И не обращать внимания на это никак нельзя.
Поэтому в твоем коде добавляем

  1. Dim Result = d_List.ToArray()


Итог - твой код показывает результат на 2-5% хуже чем код EROS'а. Опять же вопрос - можешь объяснить причину этого? Нам было бы очень интересно узнать.

Вобщем ждем твоих ответов с нетерпением.

Ответить

Номер ответа: 8
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #8
Добавлено: 23.04.09 00:01
EROS пишет:
__Pavel__, ты специально всех в заблуждение вводишь своими ответами или просто сам нифига не знаешь?
... юзай File.ReadAllLines ...

EROS пишет:
Судя по коду, ты делаешь тоже самое

ВОТ! То что я и хотел услышать! А то что я делаю все вручную... мне так нравится ;)
Steel Brand пишет:
рррр... гав гав гав... что-то умное... гав гав
Итог - твой код показывает результат на 2-5% хуже чем код EROS'а

Сорри за грубую оптимизацию твоего ответа, но главный смысл перенес :)
Но согласись, что не всегда нужно считывать весь файл! А если это лог? Они бывают огромные и проверять их иногда нужно, а считывать все сразу это мягко сказать неразумно! Да и много примеров можно привести когда люди вместо БД пользуются *.txt или *.ini (тут недавно кто-то тему похожую создавал)... вобщем 2-5% это ничто по сравнению с тем что я привел.
"понятные причины" - лично у меня недостаток памяти :)

Ответить

Номер ответа: 9
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #9 Добавлено: 23.04.09 04:07
__Pavel__ пишет:
"понятные причины" - лично у меня недостаток памяти

Ну ок, у тебя недостаток памяти.

Я ж говорю - у меня 6 гигабайт памяти. 64-битная система. Приложения я собираю тоже 64-битное. То есть теоритически приложение сможет получить порядка 5 гигабайт, может и больше. Очевидно, что проблем с памятью нет (иначе мы бы получили OutOfMemoryException - а я его не получил).

В чем же причина того что я не дождался окончания загрузки? 20 минут - более чем достаточно для того чтоб считать с диска 1.2 ГБ (ты сам говорил что у тебя это десятки секунд занимает).

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам