2015-02-06 4 views
0

В файле Java, имеющем файл 335Gb размер, который содержит отдельные номера в каждой строке, мне нужно прочитать его по строке, как если бы это был поток чисел - я не должен хранить все данные в памяти. Мне сказали, что класс Scanner не будет работать. Не могли бы вы порекомендовать наилучший способ сделать это?Прочитайте огромный файл чисел на Java в режиме экономии памяти?

+1

Используйте 'BufferedReader'. –

+1

335 gb? это огромный ... можете ли вы опубликовать некоторые примеры данных, чтобы узнать, можем ли мы адаптировать наше решение к формату данных? – Arkantos

+2

Почему сканер не работает? Кстати, я предполагаю, что вы имеете в виду 335 GB = Giga-byte вместо Gb = giga-bit. –

ответ

3

Ни один из классов потока ввода java.io не «сохранил все данные в памяти». Я думаю, что вы можете выбрать то, что лучше для вас, например BufferedReader или DataInputStream и т. Д.

+0

плюс один, и сканер –

1

Если вы используете BufferedReader, вы сможете получить до 90 МБ/с в одном потоке.

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

Например, вы можете карта памяти 335 ГБ в память сразу без использования кучи. Это будет работать, даже если у вас есть доля этого объема основной памяти.

Какова скорость передачи данных, которую вы можете получить с помощью вашей дисковой подсистемы?

+0

Почему ссылка на жесткое число 90 МБ/с? Моя система, конечно, позволяет больше, другие могут быть медленнее. Я сомневаюсь, что любой трюк ускорит задачи так просто, как описано. – Holger

+0

@Holger 90 МБ/с предназначен для типичного быстрого процессора. Если есть запасная пропускная способность чтения, использование файлов с отображением памяти и нескольких потоков может помочь достичь максимальной пропускной способности чтения. например Я превысил 1,2 ГБ/с, используя SSD и файлы с отображением памяти. –

+0

Многопоточность вряд ли ускорит ввод-вывод, который идет последовательно, хотя одна шина. Если вы говорите о 1,2 Гбайт/с, тогда синтаксический анализ чисел параллельно может действительно улучшить хотя бы, но на самом деле это доказывает, что в вашей системе ввод-вывод - это * не * узкое место. Поэтому я не считаю, что одна и та же система разрешает только 90 Мбайт/с при использовании «BufferedReader» ... – Holger

Смежные вопросы