буферное кеширование std :: ifstream

В моем приложении я пытаюсь объединить отсортированные файлы (конечно, сохраняя их отсортированными), поэтому мне приходится перебирать каждый элемент в обоих файлах, чтобы записать минимальный в третий. Насколько я понимаю, это работает довольно медленно с большими файлами. Не вижу другого выбора (необходимо выполнить итерацию). Я пытаюсь оптимизировать загрузку файлов. Я могу использовать некоторый объем ОЗУ, который я могу использовать для буферизации. Я имею в виду, что вместо того, чтобы читать 4 байта из обоих файлов каждый раз, когда я могу прочитать что-то вроде 100 МБ и работать с этим буфером после этого, пока в буфере не будет элемента, тогда я снова заполню буфер. Но я предполагаю, что если Stream уже делает это, даст ли мне больше производительности и есть ли причина? Если fstream это сделает, может, я смогу изменить размер этого буфера?

добавлено

Мой текущий код выглядит так (псевдокод)

// this is done in loop
int i1 = input1.read_integer();
int i2 = input2.read_integer();
if (!input1.eof() && !input2.eof())
{
   if (i1 < i2)
   {
      output.write(i1);
      input2.seek_back(sizeof(int));
   } else
      input1.seek_back(sizeof(int));
      output.write(i2);
   }
} else {
   if (input1.eof())
      output.write(i2);
   else if (input2.eof())
      output.write(i1);
}

Что я не делаю? Например, здесь

  • seek_back - мне нужно вернуться к предыдущей позиции, так как нет возможности просмотреть 4 байта
  • слишком много чтения из файла
  • , если один из потоков находится в EOF, он все равно продолжает проверку этот поток вместо того, чтобы помещать содержимое другого потока непосредственно в вывод, но это не большая проблема, потому что размеры блоков почти всегда равны.

Можете ли вы предложить улучшения для этого?

Спасибо.

8
задан ledokol 30 December 2010 в 08:26
поделиться