0

Итак, я пытаюсь читать в кучке очень больших файлов данных, и каждый из них занимает довольно много времени для загрузки. Я пытаюсь выяснить, как загрузить их в кратчайшие сроки и без проблем с памятью. Как только файлы данных загружаются в массив правильно, мне не нужно писать им, а просто нужно читать. Я пытался распараллелить это в течение некоторого времени, но не могу понять это.Многопроцессорность 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 часа. И я буду использовать МНОГО МНОГО. У меня есть доступ к другой машине с гораздо большим количеством ядер, что на самом деле я буду делать это, и я бы хотел использовать их правильно.

ответ

0

Так как я решил, что это был формат h5. То, что я сделал писать петлю таким образом, чтобы они имели только ITER

def LoadTimeFiles(i): 
    from pandas import read_csv 
    import h5py as h5 
    dataFile = h5.File('data.h5','r+') 
    rFile = dataFile['files'][i] 
    data = dataFile['data'] 
    lheader = len(data[0,:,0]) 
    numPts = len(data[0,0,:]) 
    allData = read_csv(rFile,delimiter="\t",skiprows=2,header=None,low_memory=False).T 
    for j in range(0,lheader): 
     data[i,j,:] = allData[0][j*numPts:(j+1)*numPts] 
    del allData 
    dataFile.close() 

def LoadTimeFilesParallel(np): 
    from multiprocessing import Pool, freeze_support 
    import h5py as h5 
    files = h5.File('data.h5','r') 
    numFiles = len(files['data'][:,0,0]) 
    files.close() 
    pool = Pool(np) 
    freeze_support 
    pool.map(LoadTimeFiles,range(numFiles)) 

if __name__ == '__main__': 
    np = 5 
    LoadTimeFilesParallel(np) 

Так, так как я хранить данные в формате h5 в любом случае я думал, что я был бы сложным и загрузить его в каждом цикле (я могу не просматривайте время при чтении файлов h5). Я добавил параметр low_memory=False в команду read_csv, потому что он запустил его быстрее. J-цикл был очень быстрым, поэтому мне не нужно было ускорять его.

Теперь каждая петля LoadTimeFile занимает около 20-30 секунд, и мы делаем 5 сразу без учета порядка. Мой баран никогда не бьет выше 3.5Gb (общее использование системы) и возвращается после концерта после запуска.