python 3中的to_hdf导致MemoryError

时间:2018-03-21 12:53:05

标签: python-3.x pandas hdf5

我正在为我的论文写一段代码,它收集了一系列代表温度图像的.csv文件。我希望通过将这些.csv文件存储到数据帧中来更有效地使用它们。

我有多个+10000帧的视频,每个视频应存储在一个单独的数据帧中。我制作了一个适用于较少数量文件的代码,但是当在一堆视频上运行代码时(比方说10),它会在几个视频后崩溃。它返回MemoryError。我已经尝试了gc.collect()函数并在使用df.to_hdf之后删除了数据帧,以防止python在已创建的内存中保持列表打开。我的内存使用量一直在增加,直到它完全填满RAM,然后崩溃。

此处添加了相关的代码段。

dfs={}
for l in range(k*number_of_csv,len(i)):
    df=pd.read_csv(i[l],sep=',',header=None)
    dfs['{:0>8}'.format(i[l])] = df
dfs=pd.concat(dfs)
dfs.to_hdf('experiment_data_series_'+str(k)+'.h5',key='raw',mode='w')
del dfs
gc.collect()

简而言之:它从所有csv文件构建一个数据帧,然后将它们存储到h5文件中。

有人可以检测到缺少什么来防止这会过度消耗内存吗? 我已经插入了一个分块程序,因此存储在单个h5中的.csv文件数总是<20000。 (通常h5文件的大小为3-4GB)

我怀疑python为存储操作分配了一些内存,但之后不会释放它。 我很感激你的帮助。

亲切的问候, 塞德里克

1 个答案:

答案 0 :(得分:0)

由于您已声明每个视频应存储在单独的数据框中,因此我不认为您需要将它们全部连接到dfs。只需阅读每个.csv文件,然后在自己的密钥下将其写入HDFStore;想象dictDataFrame个对象。

请考虑以下代码:

# create an HDF5 file which will contain all your data;
# this statement automatically opens the h5 file for you
hdf = pd.HDFStore('experiment_data_series.h5')

for l in range(k*number_of_csv,len(i)):
    df = pd.read_csv(i[l], sep=',', header=None)

    # store this dataframe in the HDF5 file under some key
    hdf['raw_{}'.format(k)] = df

# when you are finished writing to the HDF5 file remember to close it
hdf.close()

稍后您可以再次打开该文件并查看一些信息

hdf = pd.HDFStore('experiment_data_series.h5', mode='r')
print(hdf.info())
print(hdf.keys())

# you can get one dataframe by its key
df = hdf.select('raw_0', auto_close=True)

我认为这应该有效,因为您不会立即将所有数据加载到内存中,即您正在使用磁盘。