簡體   English   中英

讀進程寫的最佳緩沖區大小

[英]Optimal Buffer size for read-process-write

在我的函數中,我需要將文件中的一些數據讀入緩沖區,操作數據並將其寫回另一個文件。 該文件大小未知,可能非常大。

如果我使用一個小緩沖區,將會有一個很長的讀/寫周期,這將花費很多時間。 相反,長緩沖區意味着我需要消耗更多內存。 我應該使用的最佳緩沖區大小是多少? 這種情況是依賴的嗎?

我在Windows中看到了一些像Tera copy這樣的應用程序,可以高效地管理大量文件。 我應該注意其他任何技術或機制嗎?

注意:此程序將在Windows下運行。

了解微軟對IO大小的看法: http//technet.microsoft.com/en-us/library/cc938632.aspx 基本上,他們說你應該在64K塊中做IO。

在* NIX平台上, struct stat有一個st_blksize成員,它表示應該是最小IO塊大小。

它確實是高度依賴於案例的,您應該只編寫程序以便能夠處理靈活的緩沖區大小,然后嘗試最佳大小。

如果你從小處開始然后增加緩沖區大小,你可能會達到一定的大小,之后你將看不到或極小的性能提升,因為CPU花費了大部分時間來運行你的代碼,以及來自I的開銷。 / O已經變得可以忽略不計了。

內存管理始終取決於案例,特別是與文件I / O結合使用時。

我方有兩種可能的建議。

1)使用固定的I / O緩沖區大小,例如64K,256K,512KB或1MB。 但是在這種情況下,當I / O超過此固定緩沖區大小時,您必須考慮在多次迭代中完成I / O的偏移。

2)使用malloc()使用變量I / O緩沖區大小,但這也取決於某些因素。 例如系統中的可用RAM以及操作系統中進程的最大動態內存分配限制。

這些事情的第一條規則是基准。 我的猜測是你過早地優化了。 如果您正在使用真正的文件IO,那么磁盤(或其他)的帶寬通常會成為瓶頸。 只要您將數據寫入多個頁面的塊中,性能就不會發生太大變化。

您可能希望與寫入操作並行地計算部分數據。 為此,您必須保留兩個緩沖區,一個當前已寫入,另一個用於處理。 然后你將使用異步IO功能(POSIX系統上的aio_write ,也可能是Windows的類似),並為每次迭代切換緩沖區。

我建議你使用頁面大小的緩沖區大小。 例如,頁面大小為4K,那么您可以使用4K字節緩沖區大小來最小化上下文切換。

雖然我不能說算法...內存使用與處理器使用是編程中的經典困境,你應該根據具體情況選擇...所以如果系統有4GB可用內存,你顯然會消耗很多而如果你只有512MB,那么你應該花費很少的代價來運行CPU。 最好的方法是以編程方式檢查和更改您的尺寸:)

暫無
暫無

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

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