簡體   English   中英

在python中處理非常大的netCDF文件

[英]Handling very large netCDF files in python

我正在嘗試使用非常大的netCDF文件(每個大約400 Gb)的數據。 每個文件都有一些變量,都比系統內存大得多(例如180 Gb vs 32 Gb RAM)。 我試圖使用numpy和netCDF4-python通過一次復制一個切片並對該切片進行操作來對這些變量進行一些操作。 不幸的是,讀取每個切片需要很長時間,這會影響性能。

例如,其中一個變量是形狀數組(500, 500, 450, 300) 我想操作切片[:,:,0] ,所以我做了以下幾點:

import netCDF4 as nc

f = nc.Dataset('myfile.ncdf','r+')
myvar = f.variables['myvar']
myslice = myvar[:,:,0]

但最后一步需要很長時間(我的系統約5分鍾)。 例如,如果我在netcdf文件中保存了一個形狀變量(500, 500, 300) 500,500,300),那么相同大小的讀取操作只需幾秒鍾。

有什么方法可以加快速度嗎? 一個明顯的路徑是轉置數組,以便我選擇的索引首先出現。 但是在如此大的文件中,這在內存中是不可能的,並且考慮到簡單的操作已經花費很長時間,嘗試它似乎更慢。 我想要的是以Fortran的界面get_vara函數的方式快速讀取netcdf文件的片段。 或者某種有效轉置陣列的方法。

您可以使用nccopy實用程序將netCDF變量轉換得太大,以適應內存,這將在此處記錄:

http://www.unidata.ucar.edu/netcdf/docs/guide_nccopy.html

我們的想法是通過指定變量所需的塊(多維圖塊)形狀來“重新發布”文件。 您可以指定用作緩沖區的內存量以及塊緩存的使用量,但目前尚不清楚如何在這些用途之間以最佳方式使用內存,因此您可能只需嘗試一些示例並計算時間。 您可能希望通過指定沿切片的2個大維度具有大量數據並且沿其他維度僅具有少量值的塊來“部分轉置”它,而不是完全轉置變量。

這是一個評論,而不是答案,但我不能對上述評論,對不起。

據我所知,你要處理myvar[:,:,i] ,與irange(450) 在這種情況下,您將執行以下操作:

for i in range(450):
    myslice = myvar[:,:,i]
    do_something(slice)

而瓶頸在於訪問myslice = myvar[:,:,i] 你有沒有嘗試比較訪問moreslices = myvar[:,:,0:n]需要多長時間? 這將是contiguos數據,也許你可以節省時間。 您可以選擇與您的內存一樣大的n ,然后處理下一個數據塊moreslices = myvar[:,:,n:2n] ,依此類推。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM