Есть ли способ эффективно читать много файлов одновременно? - PullRequest
0 голосов
/ 28 октября 2011

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

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

Но циклически просматривать и открывать / закрывать файлы было бы довольно неэффективно, я думаю.

Есть ли какой-нибудь эффективный механизм для обработки того, что я пытаюсь сделать?

ПРИМЕЧАНИЕ: эта функция может распространяться на машины, которые я не могу контролировать, поэтому я не могу просто изменить настройки в ОС.

1 Ответ

0 голосов
/ 28 октября 2011

Я хочу делать тысячи файлов одновременно.Возьмите первый байт всех файлов и сделайте что-нибудь, перейдите к следующему байту и т. Д.

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

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

Вы могли бы.Единственный способ выяснить это - попробовать.

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

Что вы можете сделать, так это выяснить ограничениеодновременных открытых файлов, которые может обработать ваша система.Скажем просто ради обсуждения, что ваша система может открывать 100 файлов одновременно, и у вас есть 2500 файлов для обработки.

Тогда ваш процесс будет выглядеть примерно так:

  • Откройте первые 100 файлов.
  • Напишите выходной файл, который содержит первый байт из 100 файлов, затем второй байт из 100 файлов и т. Д.
  • Обработайте любые проблемы, которые выможет возникнуть, если 100 файлов не имеют одинаковую длину байта.

Теперь, после выполнения этого процесса через все ваши файлы, у вас будет 25 промежуточных файлов.

Тогда ваш второй процесс будет выглядеть примерно так.

  • Откройте 25 промежуточных файлов.
  • Обработайте первые 100 байтов из каждого файла.

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

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