Сохранение файлов с использованием многопоточности в python

#python #hash #python-multithreading

#python #хэш #python-многопоточность

Вопрос:

У меня есть куча файлов, которые я хочу загрузить, обработать и сохранить в другой файл, и, поскольку размер огромен, я использовал многопоточность (в цикле for). Однако после обработки сохраняется только несколько файлов. Как мне убедиться, что все файлы сохранены?

Фрагменты кода — 1. Main

 for b in range(40):
    with open("/data/b{0}.pickle".format(str(b)), "rb") as f:
        data = pickle.load(f)
    name="hash_table_" str(b)
    p = multiprocessing.Process(target=generate_hash, args=(data,name))
    processes.append(p)
    p.start()

for process in processes:
    process.join()
  
  1. Обработка файлов:
 def generate_hash(m, name):
    hash_table = {}

    for index, elem in enumerate(m):

       ...
       # some code that updates hash_table
    save_hash_table(hash_table, name)

    return hash_table
  
  1. Функция для сохранения файлов:
 def save_hash_table(hash_table, name):
    with open(os.path.join("/data/hashes", name ".pickle"), "wb") as f:
        pickle.dump(hash_table, f)
  

Ожидаемые файлы — от hash_table_0 до hash_table_39 файлов pickle, всего 40 файлов

Фактические файлы — около 20 файлов между hash_table_0 и hash_table_39

Комментарии:

1. Должна ли строка «для процесса в процессах» иметь тот же уровень отступа, что и для b в list_of_bs? Другими словами, вы запускаете 40 процессов, а затем присоединяете их ко всем впоследствии? Возможно, стоит рассмотреть пул или какой-либо другой менеджер ресурсов. Также содержит ли list_of_bs все неповторяющиеся числа? Если вы заменили list_of_bs на range(40), вы получите тот же результат?

2. @AndrewL Что касается list_of_bs, я использовал диапазон (40). Получив только половину сохраненных файлов, чем ожидалось, я создал список номеров, соответствующих всем оставшимся, и перечислил их. Спасибо, что указали на это; отредактировал сообщение, поскольку оно соответствует этой проблеме. Что касается использования пула, я не смог понять, как сохранять файлы при использовании пула. Не могли бы вы помочь мне с этим?

3. Извините, только что увидел, что вы ответили. Вам все еще нужна помощь в этом?

4. Нет проблем. Я понял, как использовать «Пул» в этом случае. Проблема, с которой я столкнулся, заключалась в том, что она занимала слишком много оперативной памяти. Возможно, это ошибка в моем коде, но я наконец получил нужные мне файлы. Спасибо.