Производительность чтения из файла по сравнению с ArrayList - PullRequest
1 голос
/ 10 февраля 2010

Я должен использовать тысячи данных, считанных из файла, и использовать эти данные сотни раз, чтобы обучить и протестировать мой алгоритм AI. Прямо сейчас у меня есть два возможных решения. Один из них - продолжать считывать данные из файла каждый раз, когда мне нужно использовать тысячи данных. Другой способ - считывать данные из файла и сохранять данные в ArrayList, а затем периодически использовать массив, просматривая его. Какой путь быстрее? Если возможно, может ли кто-нибудь также предоставить мне большую запись для каждого из двух методов? Кроме того, может ли быть совершенно новый подход к этой проблеме, который может сократить время, необходимое для чтения объема данных, переполненных при переполнении?

Ответы [ 5 ]

2 голосов
/ 10 февраля 2010

Используете ли вы данные последовательно или методом произвольного доступа? Если это произвольный доступ, то может быть быстрее загрузить его в память, так как вам не нужно будет перемещать указатель файла. Было бы большим штрафом, если бы вам нужно было выделить память для выполнения операций над данными на каждой итерации, но без дополнительной информации я не смог бы сказать, что это было.

Если вы обращаетесь к данным поочередно, то между этими двумя методами нет разницы в «big-o». Это полностью зависит от операционной системы и физической архитектуры. На хорошей ОС с хорошим кешированием файловой системы оба метода должны быть схожими, с преимуществом по скорости - кешированием в списке массивов и преимуществом с пространством при чтении из файла, так как вам не нужно постоянно распределять память.

Мой лучший совет - реализовать оба метода на вашей целевой ОС и ЦП. Из-за разницы порядка скоростей между скоростью обработки ЦП, кэшем памяти ЦП, оперативной памятью и доступом к диску очень сложно предсказать производительность на современных архитектурах, когда у вас есть два алгоритма с одинаковым big-o.

2 голосов
/ 10 февраля 2010

Вы должны написать простой тест производительности для обоих, но я вполне уверен, что чтение с диска и кэширование результатов в памяти через ваш arraylist будет выигрывать каждый раз. Из-за накладных расходов / задержек файлового ввода-вывода ваши результаты будут расходиться по мере увеличения количества прочитанных вами элементов.

1 голос
/ 10 февраля 2010

Как уже говорили другие, анализ big-O будет таким же.

Это потому, что вы всегда сначала просматриваете все данные, а затем каждый раз повторяете их использование одним и тем же способом.

Это хороший пример того, почему асимптотический анализ не всегда достаточен: здесь ваша разница будет из-за дискового ввода-вывода. Дисковый ввод / вывод обычно занимает миллисекунды; память будет занимать микросекунды, возможно, приближаясь к наносекундам, если ваши данные могут быть кэшированы правильным образом.

Если не все уместится в памяти, у вас действительно не останется иного выбора, кроме как использовать метод чтения файлов. И это будет медленно. Но так бывает, к сожалению, иногда.

1 голос
/ 10 февраля 2010

Я думаю, что:

  • чтение из ArrayList намного быстрее.
  • большой O такой же, это единица времени операций, которая отличается

Проблема возникает, если ваша память недостаточно велика, чтобы вместить все это. Тогда вам придется прибегнуть к использованию файла, торгующего скоростью для (памяти) размера.

0 голосов
/ 10 февраля 2010

Нет необходимости в большом анализе O. Память ввода-вывода всегда превосходит дисковый ввод-вывод (движущиеся части). Просто изучите алгоритмы сортировки на основе памяти и алгоритмы сортировки на диске, и вы увидите.

Дисковый ввод-вывод следует учитывать, когда у вас так много данных, что они не помещаются в память.

...