簡體   English   中英

最佳文件輸出緩沖區大小是多少?

[英]What is the optimal file output buffer size?

例如,請參見下面的代碼。 size為1MB,運行速度肯定快於1MB。我認為這是因為IO系統調用次數減少了。 這是否意味着我將永遠受益於更大的緩沖區大小? 我希望如此並進行了一些測試,但似乎存在一些限制。 size為2時,運行速度將比為1時快得多,但是並沒有那么快。

有人可以更好地解釋嗎? 最佳緩沖區大小可能是多少? 我為什么不從無限擴大其規模中受益匪淺。

順便說一句,在本示例中,為簡單起見,我寫到了stdout ,但是我也在考慮何時寫入磁盤中的文件。

enum
{
  size = 1 << 20
};

void fill_buffer(char (*)[size]);

int main(void)
{
  long n = 100000000;
  for (;;)
  {
    char buf[size];
    fill_buffer(&buf);
    if (n <= size)
    {
      if (fwrite(buf, 1, n, stdout) != n)
      {
        goto error;
      }
      break;
    }
    if (fwrite(buf, 1, size, stdout) != size)
    {
      goto error;
    }
    n -= size;
  }
  return EXIT_SUCCESS;
error:
  fprintf(stderr, "fwrite failed\n");
  return EXIT_FAILURE;
}

通常,您不需要最佳的緩沖區大小,這可能需要在OS中查詢系統參數,並進行復雜的估計甚至對目標環境進行基准測試,並且它是動態的。 幸運的是,您只需要一個足夠好的值。

我會說4K〜16K緩沖區適合大多數正常使用。 其中4K是普通計算機(x86,arm)支持的頁面大小的幻數,也是通常物理磁盤扇區大小(512B或4K)的倍數。

如果您要處理大量數據(千兆字節),您可能會意識到簡單的fwrite-model不足以阻止其阻塞。

在大型分區上,群集大小通常為32 KB。 在較大的讀/寫請求中,如果系統看到有一系列連續的群集,它將把它們組合成一個I / O。 否則,它將請求拆分為多個I / O。 我不知道最大I / O大小是多少。 在某些舊的SCSI控制器上,它為64 KB或1 MB-8 KB(控制器中為17或255個描述符)。 對於IDE / Sata,我已經能夠完成2 MB的IOCTL,確認它是帶有外部總線監視器的單個I / O,但是我從未測試過確定極限。

對於使用k> 2的自底向上合並排序的外部排序,使用10> 100 MB的讀/寫大小可減少隨機訪問開銷。 該請求將被分解為多個I / O,但讀或寫將是順序的(在理想情況下)。

暫無
暫無

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

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