Pythonメモリエラー(UnixとWindows)

大きなJPEG2000画像を読み込んでTIFに変換するアプリケーションを開発しています。その後、ピクセルデータを抽出し、何らかの処理が行われます。 1つのケースを除いて完全に動作します。

最大の画像を読み込んでデータ(10956x10956配列)を読み込むと、プログラムはクラッシュしますが、Windowsではクラッシュするだけで、Linuxでは使用できません。 (私は移植可能なアプリケーションが好きです)。

問題を検出しました。画像サンプリングに20x20を補間するときにメモリエラーが原因です。

f=RectBivariateSpline(x,y,Sun_angles)

xnew = numpy.linspace(x.min(),x.max(),rows)

ynew = numpy.linspace(y.min(),y.max(),columns)

Sun_angles_new = f(xnew, ynew) #here it crashes

また、 interp2d mapcoordinates を試してみましたが、同じ結果が得られました。

Pythonは完全に移植可能と思われていますが、Unixシステム用に最適化されている印象を受けています( WindowsマシンとLinuxの両方でPythonを実行する

注:私は2つの異なるコンピュータでプログラムを実行しますが、プロセッサとRAMは同じです。

したがって...何が理由だろうか?そして、メモリ消費量の少ない他の補間はありますか?

注:1つの解決策は、画像をタイルで分割し、補間することです。

1
どのアーキテクチャ(32ビット対64ビット)が各OSですか?
追加された 著者 Marcelo Cantos,
すべてのCore 2 CPUは64ビットですが、それほど意味はありません。 Windowsでは、コンピュータのプロパティウィンドウ(「スタートメニュー」の「コンピュータ」を右クリックします)の「システムタイプ」の項目を調べることで、実際の実行アーキテクチャを確認できます。 Linuxでは 32 または 64 のいずれかを表示する getconf LONG_BIT を実行できます。
追加された 著者 Marcelo Cantos,
私は再びチェックして、メモリは同じですが、プロセッサは異なります。 WindowsではCore2Duo 32ビット、LinuxではIntel i5 64ビット...残念です。
追加された 著者 gorro,
おそらく、異なる命令セットやその他の原因がありますが、ダイナミックメモリは同じです。
追加された 著者 gorro,

1 答え

ウィンドウの下でアプリケーションのメモリ使用量を調べる必要があります。各ピクセルにメモリを割り当てる場合、生のイメージのサイズが〜360MB(24ビットイメージを前提とする)になることを考慮すると、これは増え、32ビットアドレス空間のメモリ要件を簡単に超える可能性がありますWindowsアプリケーションの場合は2GBまでに制限されています)

Linuxでは、64ビット版のPythonを実行している64ビットLinuxを実行している可能性があります。この制限は、デスクトップアプリケーションではほとんど到達できません(アドレス空間が足りなくなる前にスワップ領域を使い果たしてしまいます)。

4
追加された
はい、イメージは大きく、あまりありません(12ビットでコード化されているため250M以下)。あなたが正しいです、私が2.32Mに達すると、プログラムはメモリエラーを示します。私は画像を分割しようとしましたが、断片で補間しました...しかし、それは役に立たないです。結局、私はすべての作品を1つにまとめる必要がありますし、もう一度クラッシュします....
追加された 著者 gorro,