我正在使用一些相当大的数据集。本质上,我在内存映射的 numpy 数组上运行 scikit-learn 中的一些工具,因为它似乎允许我处理比我的计算机上的内存更大的数据集。
我有点喜欢 joblib 来做内存映射,因为你只需要指定文件。
但我似乎无法弄清楚如何分配一个新的空数组,比如 1 亿乘 200 的 numpy 数组,仅使用 joblib 而不将所有内容加载到内存中。
谢谢!
我正在使用一些相当大的数据集。本质上,我在内存映射的 numpy 数组上运行 scikit-learn 中的一些工具,因为它似乎允许我处理比我的计算机上的内存更大的数据集。
我有点喜欢 joblib 来做内存映射,因为你只需要指定文件。
但我似乎无法弄清楚如何分配一个新的空数组,比如 1 亿乘 200 的 numpy 数组,仅使用 joblib 而不将所有内容加载到内存中。
谢谢!
我认为你可以通过使用分配一个临时数组np.memmap
,然后使用保存它来做到这一点joblib.dump
:
import numpy as np
from joblib import dump, load
import os
# allocate temporary memmaped array
init_pth = '/tmp/empty.mm'
mm = np.memmap(init_pth, dtype=np.double, mode='w+', shape=(1E8, 2E2))
# write some values to the first row
mm[0, :5] = np.arange(5)
# dump to joblib format
mmap_pth = '/tmp/test.mmap'
dump(mm, mmap_pth, compress=0)
# we can now delete the temporary array
os.remove(init_pth)
# load the memmap using joblib
mm2 = load(mmap_pth, mmap_mode='r+')
# print the first 5 values
print(mm2[0, :5])
# [ 0. 1. 2. 3. 4.]
然而,这是相当低效的,因为它涉及在磁盘上分配一个巨大的临时数组然后复制它。