7

次の構造を持つ毎日 600MB の netcdf-4 ファイルをダウンロードしています。

netcdf myfile {
寸法:
        time_counter = 18 ;
        深さ = 50 ;
        緯度 = 361 ;
        経度 = 601 ;
変数:
        塩分
        温度など     

time_counter 次元を固定サイズ (18) から無制限の次元に変換するより良い方法を探しています。

netcdf コマンドと sed でそれを行う方法を見つけました。このような:

ncdump myfile.nc | sed -e "s#^.time_counter = 18 ;#time_counter = UNLIMITED ; // (現在 18)#" | ncgen -o myfileunlimited.nc

これは小さなファイルではうまくいきましたが、600 MB の netcdf ファイルをダンプすると、多くのメモリと時間がかかります。

誰かがこれを達成するための別の方法を知っていますか?

4

3 に答える 3

1

シェル パイプラインは、sed ステップでファイルの先頭のみを変更し、他のすべてを通過させることによってわずかに改善することしかできませんが、式の処理は非常に安価であり、費やされた時間に影響を与えることはありません。

ncdump核となる問題は、ファイル情報をテキスト データにフォーマットし、ncgenテキスト データを再び NetCDF ファイル形式に解析するのに多くの時間を費やしている可能性があります。

dump+gen を経由するルートは示されているのと同じくらい遅いため、NetCDF 機能を使用してデータ ファイルを変換する必要があります。

運が良ければ、データ ファイルを直接操作して変更や変換を行うツールがあるかもしれません。そうでない場合は、NetCDF ライブラリを使用して自分で作成する必要がある場合があります。

非常に運が悪い場合、NetCDF-4 ファイルは追加のメタデータを含む HDF5 ファイルです。特に、次元の長さは_netcdf_dim_infoグループ内のデータセットに格納されます_netCDF(またはドキュメントに記載されています)。

そこの情報を変更して、ディメンションの現在の長さtime_counterを UNLIMITED の値 (数値 0) に変更することは可能かもしれませんが、これを行う場合は、結果のファイルの整合性を実際に検証する必要があります。ドキュメントはきちんとそれを置きます:

「これらのファイルを HDF5 で変更すると、ほぼ確実に netCDF-4 で読み取れなくなることに注意してください。」

補足として、このプロセスがあなたのグループにとって重要である場合は、どのハードウェアがタスクをより速く実行できるかを調べる価値があるかもしれません. 私の Bulldozer システムでは、78 メガバイトのファイルを変換するプロセスに 20 秒かかり、ncgen ワーキング セット (1 GB 仮想) に約 500 MB のメモリを使用し、ncdump ワーキング セット (111 MB 仮想) に約 12 MB のメモリを使用します。コアのより良い部分。

適切なディスクであれば、ファイルを 10 秒程度で読み取り/シンクする必要があります。スワップしない限り、メモリは問題にならないため、dump+gen ルートを使用する場合、おそらく CPU が主な関心事です。

同時メモリ使用が大きな懸念事項である場合は、sed からの中間結果をディスクに保存することで、数バイトをスペースと交換できます。これには最大で 1.5 ギガバイト程度かかる可能性があります。

于 2015-02-19T05:04:35.640 に答える