Я создал приложение, которое выполняет следующие действия:
- Сделайте несколько вычислений, напишите рассчитанные данные в файл - повторите 500 000 раз (над всем, напишите 500 000 файлов один за другим) - повторите еще 2 раза (по всему, 1,5 миллиона файлов были написано).
- Прочитайте данные из файла, сделайте некоторые интенсивные вычисления с данными из файла - повторите для 1 500 000 итераций (повторите все файлы, написанные на шаге 1.)
- Повторите шаг 2 для 200 итераций.
Каждый файл ~ 212k, поэтому у меня есть ~ 300Gb данных. Похоже, что весь процесс занимает ~ 40 дней на процессоре Core 2 Duo с 2,8 ГГц.
Моя проблема (как вы можете догадаться) - это время, необходимое для завершения всего процесса. Все вычисления являются серийными (каждый расчет зависит от предыдущего), поэтому я не могу параллельно выполнять этот процесс для разных ЦП или ПК. Я пытаюсь думать, как сделать процесс более эффективным, и я уверен, что большая часть накладных расходов идет на доступ к файловой системе (duh...). Каждый раз, когда я обращаюсь к файлу, я открываю ему дескриптор, а затем закрываю его, когда закончу чтение данных.
Одна из моих идей по улучшению времени выполнения заключалась в том, чтобы использовать один большой файл размером 300 Гбит (или несколько больших файлов по 50 Гб каждый), а затем я бы использовал только один дескриптор открытого файла и просто искал каждую соответствующую информацию и читал ее, но я не то, что накладные расходы на открытие и закрытие дескрипторов файлов. может кто-то пролить свет на это?
Еще одна идея, которую я имел, заключалась в том, чтобы попытаться сгруппировать файлы в более крупные файлы размером ~ 100 Мб, а затем я буду читать 100 МБ каждый раз, а не многие 212k-чтения, но это намного сложнее реализовать, чем идея выше.
В любом случае, если кто-нибудь может дать мне несколько советов по этому поводу или у вас есть идея, как улучшить время выполнения, я был бы признателен!
Спасибо.
Обновление профилировщика:
Я запустил профайлер процесса, похоже, что вычисления занимают 62% времени исполнения, а чтение файла занимает 34%. Имея в виду, что даже если я чудесным образом сократил расходы на входы/выходы файла в 34 раза, я все еще остаюсь на 24 дня, что является довольно хорошим улучшением, но все еще долгое время:)