100GB数据存储:numpy ndarrays的Pandas数据框架:只加载一小部分+做小修改时避免重写整个文件.&l



这段代码创建了50k行包含numpyndarrays(对于一个1.5GB的文件需要超过8分钟):

import numpy as np, pandas as pd
x = pd.DataFrame(columns=['a', 'b'])
for i in range(100000):
print(i)
x.loc['t%i' % i] = [np.random.rand(2000), np.random.rand(2000)]   # not efficient at all
# the higher i, the longer it takes!
# like if it concatenates x with a new dataframe each time
x.to_parquet('test.parquet')

正如在扩展到大型数据集中提到的,您只能加载某些列:

x = pd.read_parquet("test.parquet", column="a")

但是为了节省时间,您可以只加载特定的一行,例如x['t123'],而不读取内存中的整个文件吗?API中不存在pd.read_parquet("test.parquet", index="t123")

另外,我们如何打开一个100gb的拼花文件,只添加一行,并将其保存回磁盘,而不重写整个100gb的文件?

(最后,x.loc['t1234'] = [np.random.rand(100, 100), np.random.rand(100, 100)] ; x.to_parquet('test.parquet')不工作,因为parquet不能序列化numpy 2D或3D数组,只是numpy 1D数组…这确认parquet可能不是这个数据存储的正确数据结构)

如果您的实际数据帧是numpy数组,您可以拆分numpy值并将其保存为npz文件。同样的方法也适用于包含字符串的数据框架。您可以将它的chucks保存并加载为pickle(DataFrame.to_pickle)。迟早,如果我们讨论这些数字,很可能需要分割块。当然,文件的命名在你的算法中起着很大的作用,以找到目标文件范围。

最新更新