在我的函數中,我需要從文件讀取一些數據到緩衝區,操作數據並將其寫回到另一個文件。該文件的大小未知,可能非常大。用於讀取進程寫入的最佳緩衝區大小
如果我使用一個小緩衝區,會有一個很長的讀/寫週期,這將需要很長時間。相反,長緩衝區意味着我需要消耗更多的內存。什麼是我應該使用的最佳緩衝區大小?這個案件是否依賴?
我在窗口中看到了一些類似'Tera copy'的應用程序,可以有效地管理大型文件。有什麼其他技術或機制我應該知道嗎?
注意:該程序將在Windows下運行。
在我的函數中,我需要從文件讀取一些數據到緩衝區,操作數據並將其寫回到另一個文件。該文件的大小未知,可能非常大。用於讀取進程寫入的最佳緩衝區大小
如果我使用一個小緩衝區,會有一個很長的讀/寫週期,這將需要很長時間。相反,長緩衝區意味着我需要消耗更多的內存。什麼是我應該使用的最佳緩衝區大小?這個案件是否依賴?
我在窗口中看到了一些類似'Tera copy'的應用程序,可以有效地管理大型文件。有什麼其他技術或機制我應該知道嗎?
注意:該程序將在Windows下運行。
看看微軟有關IO尺寸:http://technet.microsoft.com/en-us/library/cc938632.aspx。基本上,他們說你應該在64K塊中做IO。
在* NIX平臺上,struct stat
有一個st_blksize
成員,它說什麼應該是最小的IO塊大小。
注意:這種觀察行爲和建議的根本原因是硬件問題。 TL; DR:*最佳*大小是您硬件可以提供的最大數量,在現代「桌面」計算機上似乎爲64K。 – 2013-03-21 09:32:36
事實上,這的確與案例有很大關係,您應該編寫自己的程序,以便能夠處理靈活的緩衝區大小,然後嘗試優化哪些大小。
如果從小尺寸開始,然後增加緩衝區大小,您可能會達到一定的大小,之後您將看不到或性能增益極小,因爲CPU花費大部分時間運行代碼,並且來自I/O的開銷變得微不足道。
雖然我不能說出算法...內存使用與處理器使用是編程中的典型困境,您應該根據具體情況選擇...因此,如果系統具有4GB可用RAM,您可以明顯消耗相當多,而如果你只有512MB,那麼你就應該花費很少的代價來執行CPU。最好的方法是在語法上檢查和改變你的尺寸:)
這不是CPU與內存問題。 – 2013-03-21 06:30:46
內存管理始終與個案有關,尤其是與文件I/O結合使用時。
我有兩種可能的建議。
1)使用固定的I/O緩衝器大小,例如, 64K,256K,512KB或1MB。但是在這種情況下,當I/O大於固定的緩衝區大小時,必須考慮偏移量以多次迭代完成I/O。
2)使用malloc()使用變量I/O緩衝區大小,但這也取決於某些因素。例如系統中的可用RAM以及操作系統中進程的最大動態內存分配限制。
我會建議你使用頁面大小的緩衝區大小。例如,頁面大小爲4K,那麼可以使用4K字節緩衝區大小來最小化上下文切換。
這些事情的首要規則是基準。我的猜測是你過早地優化。如果你正在做真正的文件IO,你的磁盤帶寬(或其他)通常會成爲瓶頸。只要你將數據寫入幾頁的數據塊,性能不應該改變太多。
你可能希望做的是對你的寫操作並行計算部分數據。爲此,您將不得不保留兩個緩衝區,一個是當前寫入的緩衝區,另一個是您處理的緩衝區。然後你可以使用異步IO功能(POSIX系統上的aio_write
,也可能類似於Windows的),併爲每次迭代切換緩衝區。
動態緩衝區大小如何? – Mysticial 2013-03-21 06:20:18
我說運行一些基準來看看。另外,不要擔心在現代PC上分配1MB或2。 – drescherjm 2013-03-21 06:20:22
也許使用'mmap'可能會有所幫助。 Linux也有一個'readahead'系統調用。 – 2013-03-21 06:21:43