メモリマップトファイルのサイズを制限するものは何ですか?未割り当てのアドレス空間の最大の連続チャンクより大きくすることはできず、十分な空きディスク領域が必要であることを私は知っています。しかし、他に制限はありますか?
保守的すぎます。メモリマップファイルはアドレス空間よりも大きくなる可能性があります。メモリマップトファイルのviewは、OSのメモリ制約によって制限されますが、それは一度に表示しているファイルの一部にすぎません。 (技術的には、ファイルの不連続部分の複数のビューを一度にマップできると思います。したがって、オーバーヘッドとページ長の制約を除けば、制限を課すのは、表示しているバイトの総数だけです。バイトを表示できます。 [0〜1024]およびバイト[240 2に40 + 1024] 2つの別々のビューで。)
MS Windowsで、 MapViewOfFile 関数を確認します。事実上、64ビットのファイルオフセットと32ビットの長さを取ります。
これは、Win32でメモリマップファイルを使用したときの私の経験です。
ファイル全体を1つのセグメントにマップする場合、より大きな連続したメモリブロックを見つけることができないため、通常は約750MBでタップアウトします。それをより小さなセグメント、たとえばそれぞれ100MBに分割すると、他に実行されているものに応じて、約1500MB〜1800MBを取得できます。
/ 3gスイッチ を使用すると、2GBを超えて最大約2700MBを取得できますが、OSのパフォーマンスが低下します。
64ビットについてはよくわかりません。試したことはありませんが、最大ファイルサイズは、使用している物理メモリの量によってのみ制限されると思います。
他の制限はありません。それらは十分ではありませんか? ;-)
Windowsの場合:「ファイルビューのサイズは、予約されていない仮想メモリの利用可能な最大の連続ブロックに制限されます。これは、最大2 GBから、プロセスによってすでに予約されている仮想メモリを差し引いたものです。」
[〜#〜] mdsn [〜#〜] から。
LINUX/OSX /その他についてはよくわかりませんが、おそらくアドレス空間にも関係しています。
Linuxで Fuse を使用すると、オンデマンドでディスクに拡張するインメモリファイルシステムを作成することもできます。それがメモリマップドとして適格かどうかはわかりませんが、区別があいまいになります。
はい、メモリマップトファイルには制限があります。最も衝撃的なのは:
メモリマップトファイルは、32ビットシステムでは2GBを超えることはできません。
Memmapによってファイルが作成されるか、ファイルシステム内の現在のサイズを超えて拡張される場合、新しい部分の内容は指定されません。 POSIXファイルシステムセマンティクスを備えたシステムでは、拡張部分はゼロバイトで埋められます。
64ビットの32GB RAMシステムでも、バイトオフセットを使用して一部を取得する代わりに、1つの大きなnumpyメモリマップファイルを読み込もうとすると、次のエラーが発生します。
Overflow Error: memory mapped size must be positive
大きなデータセットを扱うのは本当に面倒です。