Какой из них быстрее в записи в файл? - PullRequest
0 голосов
/ 30 ноября 2011

У меня очень мало опыта работы с большими файлами и ограничениями по памяти. Обратите внимание, что я использую Java в качестве языка программирования.

Я должен найти записи размером 15 ГБ и записать результат в другой файл. По сути, это реализация функции диапазона поиска. Моя цель - записать записи, которые находятся в моем диапазоне, в файл результатов, разделенный новой строкой. То есть каждая запись должна приходить на отдельной строке. И количество таких запросов составляет около 400-1000. Таким образом, каждый запрос приведет к записи множества записей, лежащих в его диапазоне.

Так что из следующего является более быстрым подходом?

1- Как только я начинаю получать записи диапазона запросов, я начинаю записывать их в файл последовательно?

2- Я храню свои записи в какой-то строке и добавляю в строку для каждой найденной записи, а затем в конце пишу?

3 - Использовать построитель строк для объединения результатов каждого запроса, а затем записывать в файл в конце? но построитель строк не поддерживает новую строку.

4- Сделать мое собственное будущее данных?

5- Сделать массив списков записей, а затем перебрать его в конце для записи в файл?

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

Ответы [ 3 ]

4 голосов
/ 30 ноября 2011

Буферизация записи на уровне ОС довольно эффективна. Используйте № 1, если у вас нет данных профилировщика, указывающих на наличие проблемы.

0 голосов
/ 30 ноября 2011

Я думаю, что Map and Reduce лучше всего подходит для этого.Я не работал над этим, но присутствовал на одной и той же сессии, и парень использовал тот же пример для этого.Разделите ваш файл и позвольте нескольким программам запустить один и тот же поисковый запрос - Map, а затем, как только поиск будет завершен, все ответы можно объединить в один, используя Reduce

0 голосов
/ 30 ноября 2011

2 и 3 звучат как доморощенные реализации буферизации.Более простым и эффективным подходом было бы сделать № 1, но заключить в FileOutputStream BufferedOutputStream.

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

...