2017-02-09 2 views
0

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

{chunk_1_size} 
{chunk_1} 
{chunk_2_size} 
{chunk_2} 
{chunk_3_size} 
{chunk_3} 
{chunk_4_size} 
{chunk_4} 
{chunk_5_size} 
{chunk_5} 
. 
. 
{chunk_n_size} 
{chunk_n} 

Файл действительно очень большой ~ 2 Гб, а размер порции составляет ~ 20MB (что это буфер, который я хочу иметь)

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

Но я не уверен, сколько буфера нужно иметь, потому что размер куска может отличаться.

псевдо-код, что я имею в виду:

while(!EOF) { 
    /*chunk is an integer i.e. 4 bytes*/ 
    readChunkSize(); 
    /*according to chunk size read the number of bytes from file*/ 
    readChunk(chunkSize); 
} 

Если позволяет сказать, что у меня есть случайный размер буфера, то я мог бы ползти в таких ситуациях, как:

  1. Первый буфер содержит chunkSize_1 + chunk_1 + partialChunk_2 --- Я должен отслеживать оставшееся время, а затем из следующего буфера получить остаточный фрагмент и конкатенацию влево, чтобы завершить кусок.
  2. Первый буфер содержит chunkSize_1 + chunk_1 + partialChunkSize_2 (размер куска целое число, то есть 4 байта, поэтому скажем, что я получаю только два из первого буфера). Я должен отслеживать partialChunkSize_2, а затем восстанавливать байты из следующего буфера, чтобы сформировать целое число, которое на самом деле дает мне следующий chunkSize
  3. Буфер не может даже быть в состоянии получить один целый кусок в то время, - я должен держать удар прочитать до первого кусок не будет полностью прочитан в память

ответ

0

Вы не имеете больше контроля над количеством вызовов на жесткий диск. Между вами и жестким диском (OS, драйвер, аппаратная буферизация) есть несколько уровней, которые вы не можете контролировать.

Установите разумный размер буфера в коде Java (1M) и забудьте об этом до тех пор, пока вы не сможете доказать, что есть проблема с производительностью, которая напрямую связана с размерами буфера. Другими словами, не попадайте в ловушку premature optimization.

Смотрите также https://stackoverflow.com/a/385529/18157

+0

Основываясь на том, что я протестировал ~ 20 МБ, было действительно быстро и на машине и на сервере. Я просто не доволен всеми группами, которые у меня есть между двумя последовательными чтениями файла, то есть в буфер. –

0

вам, возможно, придется сделать некоторый анализ и иметь представление о среднем размере буфера для чтения данных. вы говорите, чтобы сохранить размер буфера и читать данные до тех пор, пока не будет сделан кусок, чтобы иметь какое-то значение полных данных. R u копирование файла в другое место или вы отправляете эти данные в другое место? для некоторых действий. Пакеты Java NIO имеют лучшие реализации, а не чтение данных в буферы jvm. размер буфера должен быть достаточно приличным, чтобы считывать максимальные куски данных, Если планирование хранения данных в памяти, считывающих данные с использованием буферов и удерживающих их в памяти, будет по-прежнему работать с памятью, буферы могут быть освобождены разными способами, используя базовые флеш операторы. , пожалуйста, также проверьте apache file-utils для чтения/записи данных.

+0

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

+0

попытайтесь рассмотреть решение, в котором u вывести все данные во внешнее приложение, например, искать эластичный поиск и индексировать их, чтобы показать в ui даже распределенные кеши, такие как hazel-cast/redis (очистить данные, когда-то сделанные) будут содержать много данных .. неважно, сколько раз он нажимает на жесткий диск (как os с jvm и java-программой) решит no-of io hits Примечание: - производительность NIO зависит от базовой ОС, а операция u пытается do – Fryder

+0

Я ценю предложение, но с ресурсами, которые у меня есть сейчас, я не могу действительно расширить свои варианты реализации. –

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