簡體   English   中英

mmap()用於大文件I / O?

[英]mmap() for large file I/O?

我正在用C ++創建一個在Linux上運行的實用程序,它可以將視頻轉換為專有格式。 視頻幀非常大(高達1600萬像素),我們需要能夠直接尋找精確的幀數,因此我們的文件格式使用libz單獨壓縮每個幀,並將壓縮數據附加到文件上。 一旦完成所有幀的寫入,包含每個幀的元數據(包括其文件偏移和大小)的日志將被寫入文件的末尾。

我目前正在使用ifstream和ofstream來執行文件i / o,但我希望盡可能地進行優化。 我聽說mmap()可以在很多情況下提高性能,我想知道我的是否是其中之一。 我們的文件將在幾十到幾百千兆字節,雖然寫入總是按順序完成,但是隨機訪問讀取應該在恆定時間內完成。 是否有任何想法我是否應該進一步調查,如果有的話,是否有任何提示要注意事項?

謝謝!

在32位計算機上,您的進程限制為2-3 GB的用戶地址空間。 這意味着(允許其他內存使用)您將無法一次映射超過1 GB的文件。 並不意味着你不能使用mmap()非常大的文件-只是你需要將文件中的一部分,在一個時間映射。

話雖這么說, mmap()仍然可以成為大文件的一大勝利。 最重要的優點是您不會浪費內存來保存數據TWICE - 系統緩存中的一個副本,應用程序的專用緩沖區中的一個副本 - 以及制作這些副本的CPU時間。 它可以是隨機訪問的更大的加速 - 但“隨機”部分必須限制在您當前的映射范圍內。

如果您的文件是10 GB或更多,那么甚至不要考慮嘗試在32位架構上使用mmap() 直接轉到64位操作系統,應該可以正常處理它。

請注意,映射到內存空間的文件實際上並不消耗相同數量的RAM(文件大小),因此您無需在計算機中安裝數百GB的RAM。

暫無
暫無

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

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