比RAM大的Numpy阵列:写入磁盘还是核心外解决方案



我有以下工作流,通过该工作流,我将数据附加到一个空的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.])

相关内容

  • 没有找到相关文章

最新更新