#python #python-3.x #multithreading #numpy
#python #python-3.x #многопоточность #numpy
Вопрос:
Мне нужно загрузить много файлов .npy в память. Каждый из файлов содержит массив numpy и имеет размер около 3-6 Мбайт.
Я уже могу загружать эти файлы параллельно, используя numpy.загрузка, но, на мой взгляд, это все еще занимает слишком много времени.
Пример кода:
import threading
import numpy as np
def load_chunk(ch, idx, results):
# ch is a chunk of filenames to load
ars = []
for fn in ch:
ars.append(np.load(fn))
results[idx] = ars
threads = [None] * len(fn_ch)
all_results = [None] * len(fn_ch)
for i in range(len(fn_ch)):
t = threading.Thread(target=load_chunk, args=(fn_ch[i], i, all_results))
t.start()
threads[i] = t
[t.join() for t in threads]
В инфраструктуре нет узких мест. При выполнении кода процессор и доступные операции ввода-вывода на диске вообще не используются.
Рабочая нагрузка распределена по 40 потокам — увеличение этого числа до 80 или уменьшение ot до 20 никак не влияет на время загрузки.
Есть ли какой-либо способ ускорить процесс?
Комментарии:
1. Вместо многопоточности. я бы попробовал многопроцессорную обработку. А именно, я бы использовал библиотеку mpi4py и использовал функции mpi для параллельной загрузки нескольких файлов.
2. Я думаю, что загрузка из многих файлов происходит очень медленно при многократном вводе-выводе на диск. Лучше всего уменьшить количество файлов или время ввода-вывода. Например, вы можете сохранить свой массив в виде строк, а затем сохранить их в один двоичный файл.
3. спасибо @freude. мультипроцессорная обработка — это правильный путь.
4. было бы интересно прочитать ваш ответ на ваш собственный вопрос!