Как очень быстро загрузить много файлов .npy

#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. было бы интересно прочитать ваш ответ на ваш собственный вопрос!