【问题标题】:Numpy array larger than RAM: write to disk or out-of-core solution?大于 RAM 的 Numpy 数组:写入磁盘还是核外解决方案?
【发布时间】:2020-07-07 08:29:12
【问题描述】:

我有以下工作流程,我将数据附加到一个空的 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。

【问题讨论】:

  • 您可以将结果堆叠在一个唯一的 numpy 数组中,并使用 x.__sizeof__() 检查其大小。当超过某个阈值时,您可以写入磁盘并重新启动该过程。
  • @FBruzzesi 这是一个很好的计划,使用sys.getsizeof()__sizeof__()。我还不确定跟踪索引的最佳方法。
  • 您需要跟踪哪些指标?

标签: python arrays numpy memory bigdata


【解决方案1】:

查看这个 python 库:https://pypi.org/project/wendelin.core/ 它允许您使用比 RAM 和本地磁盘更大的数组。

【讨论】:

  • 这很有用!谢谢你
【解决方案2】:

您可以将所有数据帧预处理为 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.])

【讨论】:

    猜你喜欢
    • 2014-04-18
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2017-10-12
    • 2014-10-14
    • 2018-07-18
    相关资源
    最近更新 更多