我正在为我的论文写一段代码,它收集了一系列代表温度图像的.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为存储操作分配了一些内存,但之后不会释放它。 我很感激你的帮助。
亲切的问候, 塞德里克答案 0 :(得分:0)
由于您已声明每个视频应存储在单独的数据框中,因此我不认为您需要将它们全部连接到dfs
。只需阅读每个.csv
文件,然后在自己的密钥下将其写入HDFStore
;想象dict
个DataFrame
个对象。
请考虑以下代码:
# 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)
我认为这应该有效,因为您不会立即将所有数据加载到内存中,即您正在使用磁盘。