Оптимизировать чтение и запись файлов - PullRequest
1 голос
/ 28 января 2011

У меня есть этот код для чтения 64 МБ двоичных данных в память:


#define SIZE 8192
char* readFromFile(FILE* fp)
{
  char* memBlk = new char[SIZE*SIZE];
  fread(memBlk, 1, SIZE*SIZE, fp);
  return memBlk;
}

int main()
{
  FILE* fp = fopen("/some_path/file.bin", "rb+");
  char* read_data = readFromFile(fp);
  // do something on read data
  // EDIT: It is a matrix, so I would be reading row-wise.
  delete[] memBlk;
  fclose(fp);
}

Когда я использую этот код независимо, время выполнения составляет менее 1 секунды. Однако, когда я помещаю точно такой же код (только для сравнения) в одно из наших приложений, время выполнения составляет 146 секунд. Приложение довольно громоздкое с использованием памяти до 5G.

Некоторые из них могут быть объяснены текущим использованием памяти, отсутствием кэша и другими факторами, но разница в 146 раз кажется мне неоправданной.

Может кто-нибудь объяснить это?

Отображение памяти может улучшить производительность. Любые другие предложения также приветствуются.

Спасибо.

Информация о машине: Linux my_mach 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:56:44 EST 2007 x86_64 x86_64 x86_64 GNU/Linux

РЕДАКТИРОВАТЬ:

Спасибо за ваши ответы. Однако я упустил тот факт, что на самом деле место, куда я вставил, называлось 25 раз, так что это точно не фактор 146.

В любом случае, ответы были полезны, спасибо за ваше время.

Ответы [ 3 ]

3 голосов
/ 28 января 2011

5G - это огромный объем памяти, вы уверены, что у вас на борту столько физической памяти?Если нет, то разница в 146, вероятно, связана с загрузкой на диск, чтобы попытаться освободить память.

Возможно, вам также следует рассмотреть возможность использования 64-битной ОС на 64-битной машине.

3 голосов
/ 28 января 2011

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

Если вы хотите «что-то сделать» с файлом, вы можете либо:

  • Обрабатывать файл по блокам

  • Используя mmap() или какой-либо подобный метод отображения памяти в вашей операционной системе, отображать файл в память, если вам нужен более сложный доступ.

    mmap ing использует буферный кеш в качестве резервного хранилища для подкачки содержимого в сам файл вне пространства подкачки.Использование mmap обычно является самым быстрым и простым способом доступа к файлу.Хотя он не является полностью переносимым (его можно сделать переносимым в группе операционных систем UNIX, например во всех BSD, Linux, Solaris и MacOSX)

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

1 голос
/ 28 января 2011

Процесс может не иметь 64 МБ свободного хранилища, доступного в одном непрерывном блоке.Можете ли вы попробовать разбить буфер 64 МБ на цепочку меньших кусков, скажем, размером 64 КБ или 256 КБ, и посмотреть, поможет ли это улучшить производительность?

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