スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ランダムアクセスでの?書き込みで利用可能メモリが減少する

Windowsで、普通にWriteFile()とかfwrite()とかwrite()でシークしながらのラ ンダムアクセス書き込みを行うと、タスクマネージャの物理メモリの利用可能 メモリがみるみる減っていく。
XPだとメモリが減っていくのに気がつかな かったが、Vistaだとグラフの表示内容が変っており、メモリの使用量がどんど ん増えていく。
そこで、
記事紹介: Inside Vista SP1 File Copy Improvements (1) - NyaRuRuの日記

関連あるようなないような...


大容量ファイルI/Oの効率について 其の弐 - TrickDiary

ReadFile()での検証で、速度低下とのと。同じ現象か?


Memory-Leak in CreateFile()/WriteFile()/CloseHandle() / fopen()/fwrite()/fclose() - comp.os.ms-windows.programmer.win32 | Google Groups

まさに同じ現象が報告されてる。けど具体的にFILE_FLAG_NO_BUFFERING において端数分をどうやって書き込むかは、不明。


How to write a file whose size is not integer multiple of sector size with FILE_FLAG_NO_BUFFERING option? - microsoft.public.vc.language | Google Groups
Creating arbitrary length file using unbuffered IO??? - microsoft.public.win32.programmer.kernel | Google Groups
Saving lots of files.... - microsoft.public.win32.programmer.kernel | Google Groups

このあたりは、FILE_FLAG_NO_BUFFERINGを使った場合の議論で、セクタ 倍じゃないサイズの書き込みについてなど。


Win32(NT)プログラミングノウハウ集

VirtualAlloc()の使い方の実例としてメモ。


以下が、検証したコード。実行している間、利用可能メモリが減り続ける...
#include 
#include 
#include 

int main(int argc, char* argv[])
{
    const size_t buflen = 0x80000;
    unsigned char buf[buflen] = {0};
    DWORD bytes = 0;
    HANDLE fh = 0;
    fh = CreateFile(
        _T("WR0001.DAT")
        , GENERIC_WRITE|GENERIC_READ
        , FILE_SHARE_READ|FILE_SHARE_WRITE
        , NULL
        , OPEN_ALWAYS
        , FILE_ATTRIBUTE_NORMAL | 0//
        , NULL
    );
    if (fh == INVALID_HANDLE_VALUE) {
        return 0;
    }

    LARGE_INTEGER eof = {0};
    eof.QuadPart = 400 * buflen;
    ::SetFilePointerEx(fh, eof, NULL, FILE_BEGIN);
    ::SetEndOfFile(fh);

    ::srand(325456);
    for (int i = 0; i < 400; ++i) {
        ::Sleep(50);
        LARGE_INTEGER pos = {0};
        pos.QuadPart = (::rand() % 400) * buflen;
        ::SetFilePointerEx(fh, pos, NULL, FILE_BEGIN);
        ::WriteFile(fh, buf, buflen, &bytes, NULL);
    }
    ::CloseHandle(fh);

    ::DeleteFile(_T("TEST.DAT"));

    return 0;
}
スポンサーサイト

この記事へのトラックバックURL

http://memolet.blog22.fc2.com/tb.php/924-2551769d

この記事へのトラックバック

この記事へのコメント



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。