我有以下工作流,通过该工作流,我将数据附加到一个空的pandas Series对象中。(这个空数组也可以是NumPy数组,甚至是基本列表。(
in_memory_array = pd.Series([])
for df in list_of_pandas_dataframes:
new = df.apply(lambda row: compute_something(row), axis=1) ## new is a pandas.Series
in_memory_array = in_memory_array.append(new)
我的问题是生成的数组in_memory_array
对于RAM来说太大了。我不需要为了这个计算而将所有对象都保存在内存中。
我认为我的选择是,一旦阵列对RAM来说太大,就以某种方式将对象酸洗到磁盘上,例如
# N = some size in bytes too large for RAM
if sys.getsizeof(in_memory_array) > N:
with open('mypickle.pickle', 'wb') as f:
pickle.dump(in_memory_array, f)
否则,是否存在核心外解决方案?最好的情况是创建一些上限,这样对象在RAM中的增长就不会超过X GB。
查看此python库:https://pypi.org/project/wendelin.core/它允许您使用比RAM和本地磁盘更大的阵列。
您可以将所有数据帧预处理为numpy数组,并将它们保存到一个或多个npz文件中(我对npz文件的经验有限,但我没有找到附加到它们的方法。因此,如果所有数据都不适合RAM,则必须创建多个npz文件(或压缩的npz文件(如果空间问题(,然后根据需要使用内存映射访问它们。当您将npz加载为内存映射时,它会创建一个具有numpy数组名称的对象,并将数组加载到RAM中,直到您访问它们。例如:
def makeNPZ():
z = np.zeros(100000)
o = np.ones(100000)
e = np.eye(100)
dct = {'zero':z, 'one':o, 'eye':e}
np.savez_compressed('TempZip.npz', **dct)
def useNPZ():
return np.load('TempZip.npz', mmap_mode='r+')
makeNPZ()
memoryMap = useNPZ()
memoryMap.files
Out[6]: ['zero', 'one', 'eye']
memoryMap['one']
Out[11]: array([ 1., 1., 1., ..., 1., 1., 1.])