【问题标题】:Efficient way to import large data file, Python导入大数据文件的有效方法,Python
【发布时间】:2013-08-07 18:58:42
【问题描述】:

我正在处理一个从两个 NetCDF 文件中获取数据的项目,每个文件都是 521.8 MB。诚然,这些是相当大的文件。我正在使用具有 4 GB 内存的 MacBook Pro,但计算机已经使用了大约 4 年。代码是用 Python 编写的。

这些文件包含全球一年的天气数据。它是一个 4D 数组,包含时间(长度 1460)、高度(长度 17)、纬度(长度 73)和经度(长度 144)。我一次只需要该信息的某些部分。具体来说,我需要所有时间,但只需要一个海拔高度,并且只需要一个特定的经纬度区域 (20x44)。

我的代码从两个文件中收集了所有这些数据,仅识别我需要的数据,执行计算,并将数据输出到文本文件中。完成那一年后,它循环了 63 年的数据,即 126 个同等大小的文件。现在,代码说它在进程开始时内存不足。相关代码似乎是:

from mpl_toolkits.basemap.pupynere import NetCDFFile

#Create the file name for the input data.
ufile="Flow/uwnd."+str(time)+".nc"
vfile="Flow/vwnd."+str(time)+".nc"

#Get the data from that particular file.
uu=NetCDFFile(ufile)
vv=NetCDFFile(vfile)

#Save the values into an array (will be 4-dimentional)
uwnd_short=uu.variables['uwnd'][:]
vwnd_short=vv.variables['vwnd'][:]

因此,第一部分创建 NetCDF 文件的名称。第二部分从 NetCDF 文件中获取所有数据。第三部分获取导入的数据并将其放入 4D 数组中。 (从技术上讲,这可能不是一个数组,因为 Python 如何处理数据,但由于我的 C++ 背景,我认为它是这样的。对缺乏适当的词汇表示歉意。)后来,我分离出我需要的特定数据从 4D 数组中提取并执行必要的计算。问题是这曾经可以工作,但现在我的计算机在处理vv=NetCDFFile(vfile) 行时内存不足。

某处可能存在内存泄漏吗?有没有办法只获取我需要的特定数据范围,所以我不带入整个文件?从引入数据到整理出我需要使用它执行计算的数据部分,有没有更有效的方法?

【问题讨论】:

  • 如果可能的话,请您提供几行您正在导入的文件中的示例数据。
  • 当我导入一个文件,将其保存到一个数组中,然后输出该数组时,我得到以下信息:[[[[ 4.10000610e+00 4.50001526e+00 4.80000305e+00 ..., 2.90000916e+00 3.30000305e+00 3.70001221e+00] [ 3.00001526e+00 3.50001526e+00 3.90000916e+00 ..., 1.60000610e+00 2.10000610e+00 2.50001526e+00] [ -9.99984741e-01 -6.99996948e-01 -3.99993896e-01 ..., -1.49998474e+00 -1.39999390e+00 -1.19999695e+00] ..., 当然数字会继续,后来我使用了比例和偏移量。跨度>
  • 感谢我终于弄明白了 ncdump,输出如下:-16146, -16176, -16226, -16306, -16436, -16616, -16836, -17056, -17286, - 17506,-17706,-17866,-17976,-18016,-17996,-17916,-17776,-17566,-17306,-17016,-16746,-16526,-16416,-16416,-16496,-16606, -16726,

标签: python arrays macos memory netcdf


【解决方案1】:

您可能需要做的是使用 nccopy 重新分块文件,然后处理这些块,因为某些变量似乎很大以适合内存。那或获得更多内存(或虚拟内存)。

nccopy 文档在这里http://www.unidata.ucar.edu/software/netcdf/docs/guide_nccopy.html

【讨论】:

  • “或者获得更多内存”——即使我们假设没有足够的内存可用,这不应该意味着程序会崩溃,对吧?这不是页面文件和 /swap 的用途吗?
  • 我不确定我是否理解重新分块在做什么。原文件中四个维度的长度分别为1464、17、73、144。我尝试将其重新分块为1464、17、50、50,新文件为750MB(原为522MB)。当我将其重新分块为 1464、17、20 和 20 时,新文件为 637 MB。这对我来说似乎并没有更小或更有效。有什么我想念的吗?
【解决方案2】:

不管怎样,我的计算机上确实有太多数据并且内存不足。我让我的外部硬盘驱动器工作,并删除了一堆文件。然后,我最终弄清楚了如何使用 ncgen、ncdump 等。我能够从每个大文件中只取出我需要的数据,并创建一个只包含这些数据的新文件。这将我的 NetCDF 文件从 500MB 减少到 5MB。这也使代码运行得更快。

【讨论】:

猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2016-07-31
  • 2019-11-28
  • 2015-06-25
相关资源
最近更新 更多