8

Windows 32 ビットおよび 64 ビット マシンでは、ライブ ストリーミング中の大量のデータ (合計約 1 GB) を格納するためにメモリを割り当てる必要があります。malloc() を使用すると、仮想メモリ アドレスを取得することになりますが、メモリの量によっては、このアドレスが実際にハード ドライブへのページングを引き起こす可能性があります。残念ながら、HD がパフォーマンスに影響を与え、データが失われるのではないかと心配しています。

十分なメモリが利用できない場合にエラーが発生することを意味する場合でも、メモリを RAM にのみ割り当てるように強制する方法はありますか (そのため、ユーザーは他のものを閉じるか、別のマシンを使用する必要があります)。すべての操作がメモリ内で行われることを保証したいと思います。これが失敗した場合は、アプリケーションを強制的に終了してもかまいません。

別のプロセスが入ってきて、それ自体がメモリを消費する可能性があることはわかっていますが、このマシンではそれが発生していないため、心配していません (マシン上でこの大きな割り当てを行うアプリケーションはこれだけです)。

[編集:] これまでの私の試みは、次のように VirtualLock を使用することでした:

if(!SetProcessWorkingSetSize(this, 300000, 300008))
    printf("Error Changing Working Set Size\n");

// Allocate 1GB space
unsigned long sz = sizeof(unsigned char)*1000000000;
unsigned char * m_buffer = (unsigned char *) malloc(sz);

if(m_buffer == NULL)
{
    printf("Memory Allocation failed\n");
}
else
{
    // Protect memory from being swapped
    if(!VirtualLock(m_buffer , sz))
    {
           printf("Memory swap protection failed\n");
    }           
}

ただし、ワーキング セットの変更は失敗し、VirtualLock も失敗します。Malloc は null 以外を返します。

[編集2]私も試しました:

 unsigned long sz = sizeof(unsigned char)*1000000000;
 LPVOID lpvResult;
 lpvResult = VirtualAlloc(NULL,sz, MEM_PHYSICAL|MEM_RESERVE, PAGE_NOCACHE);

しかし、lpvResult は 0 なので、運もありません。

4

5 に答える 5

6

mlock、mlockall、munlock、munlockall関数を使用して、ページがスワップされるのを防ぐことができます(POSIXの一部、MinGWでも利用可能)。残念ながら、私はWindowsの経験がありませんが、VirtualLockが同じことをしているようです。

それが役に立てば幸い。幸運を!

于 2013-01-11T20:12:12.727 に答える
4

VirtualAllocはあなたが望むもののいくつかをあなたに与えるかもしれないと思います。

この問題は、CRT関数を使用する代わりに、独自のメモリマネージャを作成することだけに要約されます。

于 2013-01-11T20:12:44.620 に答える
2

NtLockVirtualMemoryドキュメントに記載されていない関数をロック オプション 2 ( LOCK_VM_IN_RAM)と共に使用する必要があります。最初に特権を要求して取得することを確認しSE_LOCK_MEMORY_NAME、付与されない可能性があることに注意してください(グループポリシーのデフォルトの特権は確かですが、誰にも付与されない可能性があります)。

VirtualLockフォールバックとして使用することをお勧めします。それも失敗した場合は、使用することをお勧めしますSetProcessWorkingSetSizeそれが失敗した場合は、失敗させてください...

これに関する素晴らしい議論については、このリンクを参照してください。ある人はこう言います。

flagを指定するLOCK_VM_IN_WSLと、特定のページをディスクにスワップしたくないことを Balance Set Manager に伝え、ターゲット プロセスのワーキング セットをトリミングするときにこのページをそのままにしておくように要求します。これは単なる目安であり、システムの RAM が不足している場合でもターゲット ページがスワップされる可能性があります。ただし、LOCK_VM_IN_RAMflag を指定すると、メモリ マネージャーにディレクティブを発行して、このページをページング不可として処理します (つまり、ドライバーがMmProbeAndLockPages() を呼び出してページをロックするときに行うことを行います。これは MDL で記述されています) 。質問は常に RAM にロードされることが保証されています。


編集:

これを読んでください。

于 2013-01-11T21:33:18.863 に答える
0

1 つのオプションは、ホストのメモリから RAM ディスクを作成することです。配布された Windows コードではこれに対するネイティブ サポートはなくなりましたが、無料で必要なドライバーや商用製品から入手できるドライバーを見つけることができます。たとえば、DRDataRam は、個人用の無料ドライバーと、ビジネス用の商用ライセンス製品をhttp://memory.dataram.com/products-and-services/software/ramdiskで提供しています。

http://www.ltr-data.se/opencode.html/#ImDisk から入手できる ImDisk Virtual Driver もあります。これはオープン ソースであり、商用利用は無料です。Microsoft の信頼できる証明書でデジタル署名されています。

Windows の RAM ドライブに関する詳細については、ServerFault.com を参照してください。

于 2013-01-11T21:44:33.183 に答える
0

Address Windowing Extensions (AWE)をご覧ください。あなたが持っているメモリの制約に一致するように思えます(私の強調):

AWE は、物理的な非ページ メモリと、32 ビット仮想アドレス空間内のこの物理メモリのさまざまな部分のウィンドウ ビューを使用します。

于 2013-01-11T22:10:45.433 に答える