当前位置: 首页 > 知识库问答 >
问题:

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

堵雅健
2023-03-14

我有下面的工作流程,在其中我将数据附加到一个空的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)

我的问题是,内存中产生的数组对于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中就不能超过XGB。


共有2个答案

傅高逸
2023-03-14

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

查看此python库:https://pypi.org/project/wendelin.core/ 它允许您使用比RAM和本地磁盘大的阵列。

 类似资料:
  • 块设备与磁盘阵列 blkdevparts= 手动设置块设备分区表(而不是从块设备读取),主要用于嵌入式环境或分区表损坏恢复的场合。详情参见Documentation/block/cmdline-partition.txt文档 [EFI] gpt 强制将拥有有效GPT签名但同时又包含无效"保护MBR"的磁盘当做GPT格式的磁盘。 [IOSCHED] elevator={"bfq"|"cfq"|"de

  • 14.2 软件磁盘阵列 (Software RAID) 在过去鸟哥还年轻的时代,我们能使用的硬盘容量都不大,几十 GB 的容量就是大硬盘了!但是某些情况下,我们需要很大容量的储存空间, 例如鸟哥在跑的空气品质模式所输出的数据文件一个案例通常需要好几 GB ,连续跑个几个案例,磁盘容量就不够用了。 此时我该如何是好?其实可以通过一种储存机制,称为磁盘阵列 (RAID) 的就是了。这种机制的功能是什么

  • 主要内容:RAID技术,标准RAID级别RAID是指独立磁盘的冗余阵列。它是一种用于连接多个辅助存储设备以提高性能,数据冗余或两者兼备的技术。它能够承受一个或多个驱动器(磁盘)故障,具体取决于所使用的RAID级别。 它由一系列磁盘组成,其中连接多个磁盘以实现不同的目标。 RAID技术 RAID技术有个级别的RAID方案。 这些模式为:,,,。 这些级别包含以下特征: 它包含一组物理磁盘驱动器。 在此技术中,操作系统将这些单独的磁盘视为单

  • 本文向大家介绍Ubuntu挂载3T硬盘或大于2T磁盘的方法,包括了Ubuntu挂载3T硬盘或大于2T磁盘的方法的使用技巧和注意事项,需要的朋友参考一下 1、显示硬盘及所属分区情况。在终端窗口中输入如下命令 可以看到要挂在的3T磁盘 因fdisk分区最大只能2T,所以这里使用parted来分区. 执行命令parted /dev/sdc 因为MBR分区表不支持容量大于2.2TB(2.2 × 1012字

  • 问题内容: 我目前正在实施ping / pong缓冲方案,以安全地将文件写入磁盘。我在Linux / CentOS计算机上使用C ++ / Boost。现在,我面临的问题是强制将文件实际写入磁盘。不管文件系统的所有缓存策略(ext3 / ext4)/ SO自定义规则/ RAID控制器/硬盘控制器如何,都可以这样做吗? 最好使用普通的fread()/ fwrite(),c ++ ostream或bo

  • 问题内容: Java是否有(或有可用的库)允许我拥有基于磁盘的HashMap?它不需要是原子的或任何东西,但是它将通过多个线程进行访问,并且如果两个线程同时访问同一个元素,则不会崩溃。 有人知道吗? 问题答案: 无论是属性文件或Berkeley DB的 可能是你在找什么。在自身实现,并提供了一些方法来从和到一个文件中。通常建议将Berkeley DB作为轻量级键/值对数据存储。