【问题标题】:How to save big array so that it will take less memory in python?如何保存大数组以减少python中的内存?
【发布时间】:2013-09-10 17:41:50
【问题描述】:

我是 python 新手。我有一个大数组a,其尺寸如(43200, 4000),我需要保存它,因为我需要它以备将来处理。当我尝试使用np.savetxt 保存它时,txt 文件太大并且我的程序遇到内存错误,因为我需要处理 5 个相同大小的文件。有什么办法可以保存大数组,从而减少占用内存?

谢谢。

【问题讨论】:

  • 你试过np.savetxt('file.npy.gz')吗?保存和随后加载(由于压缩)需要更长的时间,但它应该会大大减小文件的大小。
  • @Bill 感谢您的回复,刚刚尝试使用 np.savetxt('file.npy.gz'),它减小了我的文件大小,但无法重新加载数据。
  • 您确定加载的文件与保存时使用的文件扩展名相同吗? np.loadtxt('file.npy.gz').
  • 感谢它的工作,实际上我是在读取模式下加载它。

标签: python numpy


【解决方案1】:

将数据保存到文本文件是非常低效的。 Numpy 内置了保存命令savesavez/savez_compressed,这将更适合存储大型数组。

根据您计划如何使用数据,您还应该研究 HDF5 格式(h5py 或 pytables),它允许您存储大型数据集,而无需将其全部加载到内存中。

【讨论】:

    【解决方案2】:

    您可以使用 PyTables 创建分层数据格式 (HDF) 文件来存储数据。这提供了一些有趣的内存选项,将您正在使用的对象链接到保存它的文件。

    这是另一个 StackOverflow 问题,演示了如何执行此操作:"How to store a NumPy multidimensional array in PyTables."

    如果您愿意将数组用作 Pandas DataFrame 对象,您还可以使用 PyTables / HDF5 的 Pandas 接口,例如:

    import pandas
    import numpy as np
    a = np.ones((43200, 4000)) # Not recommended.
    x = pandas.HDFStore("some_file.hdf")
    
    x.append("a", pandas.DataFrame(a)) # <-- This will take a while.
    x.close()
    
    # Then later on...
    my_data = pandas.HDFStore("some_file.hdf") # might also take a while
    usable_a_copy = my_data["a"] # Be careful of the way changes to
                                 # `usable_a_copy` affect the saved data.
    
    copy_as_nparray = usable_a_copy.values
    

    对于这种大小的文件,您可能会考虑是否可以使用并行算法执行您的应用程序,并可能仅应用于大型数组的子集,而不是在继续之前需要消耗所有数组。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2013-05-29
      • 2013-11-19
      • 1970-01-01
      • 2012-06-15
      相关资源
      最近更新 更多