【问题标题】:How to put many numpy files in one big numpy file without having memory error?如何将许多 numpy 文件放在一个大 numpy 文件中而不会出现内存错误?
【发布时间】:2017-02-22 18:55:24
【问题描述】:

我按照这个问题Append multiple numpy files to one big numpy file in python为了将许多numpy文件放在一个大文件中,结果是:

import matplotlib.pyplot as plt 
import numpy as np
import glob
import os, sys
fpath ="path_Of_my_final_Big_File"
npyfilespath ="path_of_my_numpy_files"   
os.chdir(npyfilespath)
npfiles= glob.glob("*.npy")
npfiles.sort()
all_arrays = np.zeros((166601,8000))
for i,npfile in enumerate(npfiles):
    all_arrays[i]=np.load(os.path.join(npyfilespath, npfile))
np.save(fpath, all_arrays)
data = np.load(fpath)
print data
print data.shape

我有数千个文件,通过使用此代码,我总是出现内存错误,所以我无法获得我的结果文件。 如何解决此错误? 如何逐个文件地读取、写入和附加最终的 numpy 文件?

【问题讨论】:

  • 什么时候出现内存错误?你的np.zeros 行对我的系统来说太大了,创建了一个 10G 阵列。如果数组太大而无法保存或重新加载,则可能太大而无法操作和绘制。为什么不将数据保存在块中?它必须在一个大文件/数组中吗?
  • @hpaulj,我得到内存错误,就在这一行之后 all_arrays = np.zeros((166601,8000))。
  • 但是我当然有 166601 文件,而且很多。每个文件我有 8000 分
  • @hpaulj,请问该怎么做?如果您能帮助我,我将不胜感激。其实昨天执行我的文件时,我花了一个小时等待新文件的出现,但徒劳无功。
  • 没有希望管理阵列中的所有文件数据。一个一个地计算你的文件,只存储有用的结果。

标签: python arrays numpy


【解决方案1】:

尝试查看np.memmap。可以实例化all_arrays:

all_arrays = np.memmap("all_arrays.dat", dtype='float64', mode='w+', shape=(166601,8000))

来自文档:

内存映射文件用于访问磁盘上大文件的小段,无需将整个文件读入内存。

您将能够访问所有阵列,但操作系统会负责加载您实际需要的部分。仔细阅读文档页面并注意,从性能的角度来看,您可以决定文件是按列存储还是按行存储。

【讨论】:

  • 在我的代码中在哪里添加这一行?对我来说第一个问题是 all_arrays = np.zeros((166601,8000)),
  • 用答案中的那一行替换该行。为了安全起见,请使用 float64 而不是 float32(我会在答案中更新)
  • 我试试你的解决方案,我正在等待最终文件的出现,我尝试了 100 个文件,它可以工作,最终文件的大小为 6.251 KB,这意味着对于 166601 我需要 10414 ,166 KB, (0,009931723 GB) 或在我的磁盘 D 中我有 367 GB 是免费的。
  • 我不知道文件中的填充是如何工作的,但是作为float64,你需要 8 个字节的数字,所以8* 166601* 8000=~10Gb 看起来你应该有足够的空间。如果解决方案有效,请接受答案。谢谢
猜你喜欢
  • 1970-01-01
  • 2017-07-01
  • 2023-03-06
  • 2012-03-26
  • 2021-05-23
  • 2020-12-02
  • 2017-09-10
  • 2015-09-25
相关资源
最近更新 更多