2015-07-10 78 views
3

我正在編寫一個程序,需要遍歷一個大的40GB二進制文件,但我只有16GB的物理RAM。一位朋友告訴我,我可以使用文件映射來解決這個問題。我瞭解如何create a file mappingreading into a file map handle以及文件映射如何將永久內存中文件的部分映射到不同的虛擬內存塊以供讀取。文件映射如何工作

因此,如果我正確理解這一點,我可以創建一個說10gb的緩衝區,並將第一個10gb的文件讀入此緩衝區。但是當我必須讀取文件上的10gb標記時,操作系統是否會自動爲我獲取另一個塊,還是必須在我的代碼中手動執行此操作?

回答

2

鏈接的功能與文件映射沒有(直接)相關。它們用於常規文件I/O。

要用一個非常大的文件使用傳統的文件I/O,您可以按照您的描述進行操作。您將打開該文件,創建一個緩衝區,並將該文件的一部分讀入緩衝區。當你需要訪問文件的不同部分時,你可以將不同的塊讀入緩衝區。

要使用文件映射,請使用CreateFile,CreateFileMapping,然後使用MapViewOfFile。您不(直接)創建一個緩衝區並將文件的一部分讀入它。相反,您告訴系統您想要訪問文件範圍,就像它是一系列內存地址一樣。對這些地址的讀寫操作在幕後轉化爲文件I/O操作。在這種方法中,你可能仍然需要大塊工作。如果您需要訪問的文件部分不在您當前映射的範圍內,則可以創建另一個視圖(並可能關閉另一個視圖)。

但是請注意,我說地址空間,這是不同於RAM。如果您正在構建64位Windows,則可以嘗試將整個40 GB文件映射到您的地址空間。事實上,你只有16 GB的RAM不會阻止你。在這個尺寸下可能還有其他一些問題,但不會因爲你的RAM。如果還有其他問題,您將回到像以前一樣管理文件。

+0

好的。我正在構建一個64位程序。因此,如果我的理解正確,我可以在整個40GB空間中使用MapViewOfFile,並且操作系統將處理讀取和寫入操作? –

+0

理論上,是的。我無法保證MapViewOfFile能夠成功處理大量的請求,但值得一試。我正在假設您正在閱讀現有的大文件。如果您嘗試創建一個,那麼您可能會受到分頁文件大小的限制。 –