簡體   English   中英

附加到內存映射文件

[英]appending to a memory-mapped file

我不斷附加股票報價(整數,多頭,雙打等)。 我用mmap將此文件映射到內存中。

將新附加數據作為內存映射的一部分提供的最有效方法是什么?

我知道我可以再次打開文件(新文件描述符),然后mmap它來獲取新數據,但這似乎是低效的。 我建議的另一種方法是以1mb塊預先分配文件,寫入特定位置直到到達結尾然后將文件ftruncate為+ 1mb。

還有其他方法嗎?

Doest Boost對此有何幫助?

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);
}

預分配方案在這里可能非常有用。 確保跟蹤文件的實際長度並在關閉之前再次截斷它。

我知道答案已經被接受了,但如果我提供答案,也許會幫助別人。 提前分配一個大文件,比如說大小為10 GiB。 提前創建其中三個文件,我稱之為卷。 跟蹤您在標題,其他文件等位置的最后已知位置,然后繼續追蹤該點。 如果達到文件的最大大小並且沒用房間,請切換到下一個卷。 如果沒有更多卷,請創建另一個卷。 請注意,您可能會提前幾卷,以確保不會阻止您的附加等待創建新卷。 這就是我們在DVR系統中用於存儲連續傳入視頻/音頻以進行監視的方法。 我們不會浪費空間來存儲視頻剪輯的文件名,這就是為什么我們不使用真正的文件系統,而是我們去平面文件,我們只是跟蹤偏移,幀信息(fps,幀類型,寬度/高度等) ),時間記錄和相機頻道。 對於您來說,存儲空間對於您正在進行的工作來說是便宜的,而您的時間非常寶貴。 所以,盡可能多地抓住你想要的東西。 您基本上是在實現自己的文件系統,以滿足您的需求。 通用文件系統提供的需求與其他領域需要的需求不同。

查看mremap的手冊頁應該是可能的。

我的5,但他們更具C特異性。 制作普通文件,但mmap巨大 - 例如文件說100K,但mmap 1GB或更多。 然后,您可以安全地訪問文件大小的所有內容。 訪問文件大小將導致錯誤。 如果你使用的是32位操作系統,只是不要讓mmap太大,因為它會占用你的地址空間。

如果你在windows上使用boost/iostreams/device/mapped_file.hpp

如果讀取映射對象由於缺少共享權限而打開,則boost::filesystem::resize_file會引發異常。 相反,使用windows-api調整光盤上的文件大小,讀取mapped_file仍然可以打開。

bool resize_file_wapi(string path, __int64 new_file_size) //boost::uintmax_t size
{
    HANDLE handle = CreateFile(path.c_str(), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL, 0);
    LARGE_INTEGER sz;
    sz.QuadPart = new_file_size;

    return handle != INVALID_HANDLE_VALUE
    && ::SetFilePointerEx(handle, sz, 0, FILE_BEGIN)
    && ::SetEndOfFile(handle)
    && ::CloseHandle(handle);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM