2012-05-12 11 views
2

大きなファイルがいくつかありますが、失敗しました:約2.7GBを超えるファイルはmmapできません。十分なメモリがありますが、mmapが失敗してメモリが割り当てられません。

ulimit -aを実行すると、私の仮想メモリは無制限であると言います。私はその後、cat /proc/meminfo私のシステムは3GBのMemfreeと2GBのスワップフリーを持っていると言いました。

私は5GBまでのファイルをmmapできると仮定しています。 MAP_NORESERVEフラグを使用して、overcommit_memory1に設定するなど、インターネットで学んだことすべてを試しました。それはまだ同じです、Cannot allocate memory。おそらく何がうまくいかないでしょうか?

私は64ビットCPUと32ビットLinuxシステムを使用しています。これ以上情報が必要な場合はお知らせください。私は本当にアドバイスやヒントを感謝します。

答えて

2

あなたのアプリケーションは、大きなファイルをマップするのに十分なアドレス空間(使用可能なメモリアドレス)がありません。

Linuxでは、32ビットカーネル上で実行される32ビットプロセスは通常、約3GBのアドレス空間を使用でき、64ビットカーネル上で実行される32ビットプロセスは4GBのアドレス空間を使用できます。それ以上のものが必要な場合は、アプリケーションを64ビットプロセスとしてコンパイルする必要があります。これにより、少なくとも128TBのアドレス空間が得られます。

+0

I見る!私はあなたの速い応答に本当に感謝します! – tracy0325

10

32ビットOSには十分なアドレス空間がないため、64ビットOSを使用する必要があります。
編集:システムには物理メモリがいくつか用意されていますが、32ビットプロセスでは最大4GB、カーネルドライバでは1〜2GB程度のカーネルが予約されていますが、32ビットアプリケーションでは通常2GBです。

+0

ありがとうございます!それはすべてを説明する! – tracy0325

+1

カーネルとユーザー空間が32ビットの場合、3GBはユーザー空間で使用できますが、断片化している可能性が最も高く、連続可用性が最大で2.5GB以下です。また、インプリメンテーションではポインタの減算で危険な符号付き整数オーバーフローが発生するため、個々の割り当てが> 2GBを超えることは禁じられている可能性があります。カーネルが64ビットだがユーザー空間が32ビットの場合、32ビット(4GB)の完全なアドレス空間がユーザー空間アプリケーションで利用できるはずですが、断片化したり、連続した割り当てに制限があります... –

関連する問題