2009-03-06 7 views

答えて

1

FlushViewOfFile

チェックアウトのPython 2.6 FlushViewOfFileの例えばmmapmodule.cと、使用中のMSYNCで見つけることができます:

/* 
/Author: Sam Rushing <[email protected]> 
/Hacked for Unix by AMK 
/$Id: mmapmodule.c 65859 2008-08-19 17:47:13Z thomas.heller $ 

/Modified to support mmap with offset - to map a 'window' of a file 
/ Author: Yotam Medini [email protected] 
/
/mmapmodule.cpp -- map a view of a file into memory 
/
/todo: need permission flags, perhaps a 'chsize' analog 
/ not all functions check range yet!!! 
/
/
/This version of mmapmodule.c has been changed significantly 
/from the original mmapfile.c on which it was based. 
/The original version of mmapfile is maintained by Sam at 
/ftp://squirl.nightmare.com/pub/python/python-ext. 
*/ 

static PyObject * 
mmap_flush_method(mmap_object *self, PyObject *args) 
{ 
    Py_ssize_t offset = 0; 
    Py_ssize_t size = self->size; 
    CHECK_VALID(NULL); 
    if (!PyArg_ParseTuple(args, "|nn:flush", &offset, &size)) 
     return NULL; 
    if ((size_t)(offset + size) > self->size) { 
     PyErr_SetString(PyExc_ValueError, "flush values out of range"); 
     return NULL; 
    } 
#ifdef MS_WINDOWS 
    return PyInt_FromLong((long) FlushViewOfFile(self->data+offset, size)); 
#elif defined(UNIX) 
    /* XXX semantics of return value? */ 
    /* XXX flags for msync? */ 
    if (-1 == msync(self->data + offset, size, MS_SYNC)) { 
     PyErr_SetFromErrno(mmap_module_error); 
     return NULL; 
    } 
    return PyInt_FromLong(0); 
#else 
    PyErr_SetString(PyExc_ValueError, "flush not supported on this system"); 
    return NULL; 
#endif 
} 

UPDATE: 私にはありませんwin32のマップされたファイルAPIで完全なパリティを見つけるだろうと考えています。 FlushViewOfFile APIには同期フレーバがありません(おそらく、キャッシュマネージャの影響が考えられるため)。データがディスクに書き込まれるタイミングを正確に制御する必要がある場合は、マップファイルのハンドルを作成するときに、おそらくFILE_FLAG_NO_BUFFERINGFILE_FLAG_WRITE_THROUGHフラグをCreateFile APIで使用できます。

0

お返事ありがとうございます。 私はmysncとFlushViewOfFileの使い方を知っています。ペーストされたコードでは、OSに応じて、対応するsys呼び出しをmsync [in unix]と呼び、flushviewofFile [Windows]を呼び出します。

「フラッシングマッピングされたビューの範囲が汚いの書き込みを開始します。FlushViewofFileのMSDNドキュメントから

:私は何を探していますと、私たちはFlushViewofFileを呼び出すと、返す前に、ハードディスクへの変更をコミットしていることを確認することができ、前記のメカニズムでありますFlushViewOfFile関数は、ファイルのメタデータをフラッシュしません。また、変更内容が基盤となるハードウェアディスクからフラッシュされるまで戻るまで待つことはありませんディスクに物理的に書き込まれていることを確認するには、FlushViewOfFileを呼び出し、FlushFileBuffers関数を呼び出します。

FlushFileBuffers()はこの目的で使用できますが、これはファイルハンドルでのみ有効です。 私が持っているのは、ディスクにコミットされる必要があるメモリマップされた領域です。これは、最初にフラッシュするためにベースアドレスとバイト数を渡すFlushViewoffileです。

msyncは、データファイルの内容/バイトバッファをフラッシュしてハードディスクにコミットする単一コールでこれを実現します。私はWindowsの同等の機能を望んでいた。

+0

こんにちはMaximus_1986、私は少し更新を書いたが、私はそれがずっと助けになるとは思わない。ごめんなさい。 – yothenberg

0

私は実際にFlushViewOfFileが正しいことを疑う。 man page for msyncを読むと、実際にディスクキャッシュ(メインメモリのシステムキャッシュではなくディスクユニットのキャッシュ)がフラッシュされているとは思われません。

ディスクスタックが書き込みを完了するまでFlushViewOfFileは戻りません。 msyncのマニュアルのように、ディスクキャッシュで何が起こるかについては何も言わない。おそらくドキュメンテーションの中でそれをより明確にすることを考えるべきでしょう。

関連する問題