Лучший подход для проблем ввода-вывода?

В настоящее время я выполняю код в кластере 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 по определению всегда будет быстрее, чем запись на физический диск. Если это не так, то есть больше факторов, влияющих на вашу среду. В этом случае хорошей идеей будет запуск вашего кода под профилировщиком.

Другие вопросы по тегам