25

株価情報 (int、long、double など) のファイルに常に追加しています。このファイルは、mmap を使用してメモリにマップされています。

新しく追加されたデータをメモリ マッピングの一部として利用できるようにする最も効率的な方法は何ですか?

ファイルを再度開いて(新しいファイル記述子)、mmapして新しいデータを取得できることは理解していますが、それは非効率的です。私に提案された別のアプローチは、ファイルを1MBのチャンクで事前に割り当て、最後に到達するまで特定の位置に書き込み、ファイルを+1MBにftruncateすることです。

他のアプローチはありますか?

ブーストはこれに役立ちますか?

4

5 に答える 5

26

Boost.IOStreams には固定サイズのメモリ マップ ファイルしかないため、特定の問題には役立ちません。Linux には、mremap次のように機能するインターフェースがあります。

void *new_mapping = mremap(mapping, size, size + GROWTH, MREMAP_MAYMOVE);
if (new_mapping == MAP_FAILED)
    // handle error
mapping = new_mapping;

ただし、これは移植性がありません (そして文書化も不十分です)。Mac OS X には がないようmremapです。

いずれにせよ、ファイルを再度開く必要はmunmapありません。mmap

void *append(int fd, char const *data, size_t nbytes, void *map, size_t &len)
{
    // TODO: check for errors here!
    ssize_t written = write(fd, data, nbytes);
    munmap(map, len);
    len += written;
    return mmap(NULL, len, PROT_READ, 0, fd, 0);
}

ここでは、事前割り当てスキームが非常に役立つ場合があります。ファイルの実際の長さを追跡し、閉じる前にもう一度切り詰めてください。

于 2010-12-16T13:54:45.530 に答える
18

私は答えがすでに受け入れられていることを知っていますが、私が答えを提供すれば、おそらくそれは他の誰かを助けるでしょう。サイズが10GiBのように、事前に大きなファイルを割り当てます。これらのファイルを事前に3つ作成し、ボリュームと呼びます。ヘッダーや別のファイルなどのどこかで最後の既知の場所を追跡し、その時点から追加を続けます。ファイルの最大サイズに達して部屋が足りなくなったら、次のボリュームに切り替えます。これ以上ボリュームがない場合は、別のボリュームを作成します。新しいボリュームが作成されるのを待っている追加をブロックしないようにするために、おそらくこれを数ボリューム先に行うことに注意してください。これが、監視用のDVRシステムに継続的な着信ビデオ/オーディオを保存するために私が作業する場所でそれを実装する方法です。ビデオクリップのファイル名を保存するためにスペースを無駄にしないので、t実際のファイルシステムを使用し、代わりにフラットファイルを使用して、オフセット、フレーム情報(fps、フレームタイプ、幅/高さなど)、記録された時間、カメラチャンネルを追跡します。あなたにとって、保管スペースはあなたがしている種類の仕事のために安いですが、あなたの時間はかけがえのないものです。だから、事前に好きなだけつかんでください。基本的に、ニーズに合わせて最適化された独自のファイルシステムを実装しています。汎用ファイルシステムが提供するニーズは、他の分野で必要なニーズと同じではありません。基本的に、ニーズに合わせて最適化された独自のファイルシステムを実装します。汎用ファイルシステムが提供するニーズは、他の分野で必要なニーズと同じではありません。基本的に、ニーズに合わせて最適化された独自のファイルシステムを実装します。汎用ファイルシステムが提供するニーズは、他の分野で必要なニーズと同じではありません。

于 2012-08-19T03:06:33.670 に答える
2

mremap の man ページを見ると、それが可能であるはずです。

于 2010-12-16T12:20:07.427 に答える
1

私の 5 セントですが、より C 固有のものです。通常のファイルを作成しますが、mmap は巨大なサイズです。たとえば、ファイルは 100K ですが、mmap は 1GB 以上です。そうすれば、ファイル サイズまですべてに安全にアクセスできます。ファイルサイズを超えてアクセスするとエラーになります。32 ビット OS を使用している場合は、mmap を大きくしすぎないでください。アドレス空間が食い尽くされるからです。

于 2015-01-05T21:16:41.243 に答える