Итак, я пытаюсь читать в кучке очень больших файлов данных, и каждый из них занимает довольно много времени для загрузки. Я пытаюсь выяснить, как загрузить их в кратчайшие сроки и без проблем с памятью. Как только файлы данных загружаются в массив правильно, мне не нужно писать им, а просто нужно читать. Я пытался распараллелить это в течение некоторого времени, но не могу понять это.Многопроцессорность Python с массивами и несколькими аргументами
Предположим, у меня 400 файлов времени. Каждый из этих файлов разделен на вкладку и имеет 30 переменных, каждый из которых содержит 40 000 точек данных. Я хотел бы создать массив 400x30x40000, чтобы я мог легко получить доступ к пунктам. Файл данных настроен таким образом, что первые 40k точек для переменной 1, вторая 40k для var 2 и так далее.
Я написал функцию, которая загружается в файл времени правильно и правильно хранит его в моем массиве. У меня возникают проблемы с распараллеливанием. Это работает, если я помещаю его в цикл for и перебираю по i.
import h5py
import pandas as pd
h5file = h5py.File('data.h5','a')
data = h5file.create_dataset("default",(len(files),len(header),numPts))
# is shape 400x30x40000
def loadTimes(files,i,header,numPts,data):
# files has 400 elements
# header has 30 elements
# numPts is an integer
allData = pd.read_csv(files[i],delimiter="\t",skiprows=2,header=None).T
for j in range(0,len(header)):
data[i,j,:] = allData[0][j*numPts:(j+1)*numPts]
del allData
файлы список временных файлов загружается subprocess.check_output
(около 400 элементов), заголовок списка переменных, загружаемый из другого файла (имеет 30 элементов в нем). numPts - количество точек на переменную (примерно 40k).
Я попытался использовать pool.map
для загрузки данных, но нашел, что ему не понравилось несколько аргументов. Я также пытался использовать частичную, zip-функцию и лямбда-функцию, но ни один из них не похож на мои массивы.
Я не установлен в камне об этом методе. Если есть лучший способ сделать это, я буду очень благодарен. Это займет слишком много времени, чтобы загружать все эти данные по одному за раз. Мои вычисления показывают, что для загрузки на компьютер с использованием одного ядра потребуется ~ 3 часа. И я буду использовать МНОГО МНОГО. У меня есть доступ к другой машине с гораздо большим количеством ядер, что на самом деле я буду делать это, и я бы хотел использовать их правильно.