Лучший подход для проблем ввода-вывода?
В настоящее время я выполняю код в кластере HPC, который записывает несколько файлов по 16 МБ на диск (один и тот же каталог) в течение короткого периода времени, а затем удаляет его. Они записываются на диски и затем удаляются последовательно. Однако общее количество операций ввода-вывода превышает 20 000 * 12 000 раз.
Я использую модуль joblib в python2.7, чтобы использовать мой код на нескольких ядрах. Это в основном проблема с вложенным циклом, когда внешний цикл распараллеливается с помощью joblib, а внутренний цикл запускается последовательно в функции. Всего его (20 000 * 12 000 петель.)
Основной костяк моего кода следующий.
from joblib import Parallel, delayed
import subprocess
def f(a,b,c,d):
cmds = 'path/to/a/bash_script_on_disk with arguments from a,b > \
save_file_to_disk'
subprocess.check_output(cmds,shell=True)
cmds1 = 'path/to/a/second_bash_script_on_disk > \
save_file_to_disk'
subprocess.check_output(cmds1,shell=True)
#The structure above is repeated several times.
#However I do delete the files as soon as I can using:
cmds2 = 'rm -rf files'
subprocess.check_output(cmds2,shell=True)
#This is followed by the second/inner loop.
for i in range(12000):
#Do some computation, create and delete files in each
#iteration.
if __name__ == '__main__':
num_cores = 48
Parallel(n_jobs=num_cores)(delayed(f)(a,b,c,d) for i in range(20,000))
#range(20,000) is batched by a wrapper script that sends no more \
#than 48 jobs per node.(Max.cores available)
Этот код очень медленный, и узким местом является время ввода / вывода. Это хороший вариант использования для временной записи файлов в /dev/shm/? У меня есть 34 ГБ свободного места в виде tmpfs на / dev / shm /.
Вещи, которые я уже проверял:
Я попытался установить тот же код в меньшем масштабе на своем ноутбуке, который имеет 8 ядер. Однако запись в / dev / shm / выполнялась медленнее, чем запись на диск.
Примечание: (Внутренний цикл тоже можно распараллелить, однако количество доступных мне ядер гораздо меньше, чем 20 000, поэтому я придерживаюсь этой конфигурации. Пожалуйста, дайте мне знать, если есть более эффективные способы сделать это.)
2 ответа
Во-первых, не говорите о полных операциях ввода-вывода, это бессмысленно. Вместо этого поговорим о IOPS и так далее.
Во-вторых, почти невозможно, чтобы запись в /dev/shm/ была медленнее, чем запись на диск. Пожалуйста, предоставьте больше информации. Вы можете проверить производительность записи, используя fio
Пример команды: sudo fio --name fio_test_file --rw=read --direct=1 --bs=4k --size=50M --numjobs=16 --group_reporting
и мой результат теста: bw=428901KB/s, iops=107225
,
В-третьих, вы действительно пишете слишком много файлов, вы должны подумать о своей структуре.
Это зависит от вашего временного размера данных.
Если у вас гораздо больше памяти, чем вы используете для данных, то да - shm будет хорошим местом для этого. Если вы собираетесь написать почти столько, сколько у вас есть, то вы, вероятно, начнете менять местами, что снизит производительность всего.
Если вы можете разместить свои данные в памяти, то tmpfs по определению всегда будет быстрее, чем запись на физический диск. Если это не так, то есть больше факторов, влияющих на вашу среду. В этом случае хорошей идеей будет запуск вашего кода под профилировщиком.