2

それぞれ 521.8 MB の 2 つの NetCDF ファイルからデータを取得するプロジェクトに取り組んでいます。確かに、これらはかなり大きなファイルです。私は 4 GB のメモリを搭載した MacBook Pro で作業していますが、このコンピュータは約 4 年前のものです。コードは Python で書かれています。

ファイルには、地球全体の 1 年分の気象データが含まれています。これは、時間 (長さ 1460)、高度 (長さ 17)、緯度 (長さ 73)、および経度 (長さ 144) を含む 4D 配列です。一度に必要なのは、その情報の特定の部分だけです。具体的には、常に必要ですが、高度レベルは 1 つだけで、緯度と経度 (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 ファイルの名前を作成します。2 番目のセクションは、NetCDF ファイルからすべてのデータを取得します。3 番目のセクションは、インポートされたデータを取得し、4D 配列に配置します。(これは、Python がデータを処理する方法から、厳密には配列ではないかもしれませんが、C++ のバックグラウンドがあるため、そのように考えています。適切な語彙が不足していることをお詫びします。) 後で、必要な特定のデータを分離します。 4D 配列から必要な計算を実行します。問題は、これが以前は機能していたことですが、現在、回線で作業中にコンピューターのメモリが不足していvv=NetCDFFile(vfile)ます。

どこかにメモリリークの可能性はありますか?ファイル全体を取り込まないように、必要な特定の範囲のデータのみを取得する方法はありますか? データを取り込んでから、それを使って計算を実行するために必要なデータのセクションを整理する、より効率的な方法はありますか?

4

2 に答える 2

3

おそらく必要なことは、nccopy を使用してファイルを再チャンクし、チャンクを処理することです。これは、一部の変数がメモリに収まらないように見えるためです。それか、より多くのメモリ(または仮想メモリ)を取得します。

nccopy ドキュメントはこちらhttp://www.unidata.ucar.edu/software/netcdf/docs/guide_nccopy.html

于 2013-08-06T16:49:39.000 に答える
0

それだけの価値はありますが、コンピューターのデータが多すぎて、メモリが不足していました。外付けハード ドライブを動作させ、多数のファイルを削除しました。次に、ncgen、ncdump などの使用方法を考え出しました。それぞれの大きなファイルから必要なデータだけを取得し、そのデータだけを含む新しいファイルを作成することができました。これにより、NetCDF ファイルが 500MB から 5MB に減少しました。これにより、コードの実行も大幅に高速化されました。

于 2014-08-09T18:30:15.350 に答える