Python 大于RAM的Numpy阵列:写入磁盘还是核心外解决方案?
我有下面的工作流程,在其中我将数据附加到一个空的pandas Series对象。(此空数组也可以是NumPy数组,甚至可以是基本列表。) 我的问题是,内存中产生的数组Python 大于RAM的Numpy阵列:写入磁盘还是核心外解决方案?,python,arrays,numpy,memory,bigdata,Python,Arrays,Numpy,Memory,Bigdata,我有下面的工作流程,在其中我将数据附加到一个空的pandas Series对象。(此空数组也可以是NumPy数组,甚至可以是基本列表。) 我的问题是,内存中产生的数组对于RAM来说太大了。我不需要将所有对象都保存在内存中进行此计算 我认为我的选择是,一旦阵列对RAM来说太大,就将对象酸洗到磁盘上,例如 # N = some size in bytes too large for RAM if sys.getsizeof(in_memory_array) > N: with ope
对于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)
否则,是否存在核心外解决方案?最好的情况是创建一些cap,这样对象在RAM中的增长就不会超过X GB 您可以将所有数据帧预处理为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.])
查看此python库:
它允许您使用比RAM和本地磁盘大的阵列。您可以将结果堆叠在一个唯一的numpy阵列中,并使用x.\uuuu sizeof\uuuu()检查其大小。
。当超过某个阈值时,您可以写入磁盘并重新启动进程。@FBruzzesi这是一个很好的计划,可以使用sys.getsizeof()
或\uuuuizeof()
。我还不确定跟踪指数的最佳方法。你需要跟踪哪些指数?这很有用!谢谢你
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.])