2012-03-14 120 views
4

我將在Qt項目中使用二進制文件,並且對於Qt有點新穎,我不確定我是否應該使用QVector<quint8>QByteArray來存儲數據。這些文件可能非常小(< 1MiB)或非常大(> 4GiB)。直到運行時才知道大小。在Qt中讀取和寫入二進制文件

我需要能夠隨機查找並能夠處理文件中每個字節的操作。內存映射文件在這裏有什麼用處?

謝謝你的任何建議。

回答

4

將大文件加載到內存中,無論是QVector還是QByteArray可能都不是一個好的解決方案。

假設文件有某種結構的,你應該使用QFile::seek在的「歷史記錄」的開始自己的位置,並使用qint64 QIODevice::read (char * data, qint64 maxSize)同時在您選擇的緩衝區讀取一個記錄。

3

QIODevice::write對於QByteArray有過載如果這會影響您的決定。 QDataStream可能值得關注更大的數據。在一天結束時,由於各種容器可以工作,所以真的取決於你。

編輯:

我認爲基本的文件I/O使用你喜歡的任何緩衝可能是你所需要的。使用諸如QFile,QDataStream,QByteArray等的對象。您可以使用循環緩衝區僅讀取和處理文件的部分內容,以節省內存,尤其是在處理音頻,視頻或其他適用於流的內容時。如果像XML,CSV等文件存在已知的結構,那麼也可以使部分讀取和處理更容易,因爲您可以逐行或按標記進行標記。

內存映射文件使用虛擬內存來實現更快的I/O,通過在虛擬內存段中基本上創建磁盤上的文件副本,然後該應用程序就能夠像使用進程內存那樣使用該虛擬內存段。能夠將文件當作進程內存使您能夠進行適當的編輯,這比從文件開頭尋找位置更快,並且比製作操作系統相關API調用和處理硬盤讀/寫更快。這對於內存映射文件而言通常會有相當大的開銷,並且可能存在一些限制,具體取決於在目標平臺中如何實現分頁或您使用的是哪種體系結構。在Qt中,你將不得不設計自己的對象來使用內存映射文件,歷史上我相信linux系統比windows更好地支持這個功能。

+0

如果我將整個文件讀入QVector或QByteArray不會消耗大量內存? – nerozehl 2012-03-14 23:04:51

+0

是的,據我所知,Qt沒有內存映射文件的構造,所以我認爲你會推出自己的。就像所有的東西都需要考慮權衡一樣。請參閱答案中的其他意見。 – AJG85 2012-03-15 15:32:36