Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大于RAM的Numpy阵列:写入磁盘还是核心外解决方案?_Python_Arrays_Numpy_Memory_Bigdata - Fatal编程技术网

Python 大于RAM的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

我有下面的工作流程,在其中我将数据附加到一个空的pandas Series对象。(此空数组也可以是NumPy数组,甚至可以是基本列表。)

我的问题是,内存中产生的数组
对于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.])