【发布时间】:2017-04-04 05:46:39
【问题描述】:
我有一个程序,它的目的是从一些输入文本文件中读取,将所有可打印的字符(即 32 到 126 之间的 ASCII)过滤到一些其他输出文本文件中。
我还得到一个参数“DataAmount”——这意味着我需要读取的数据量是多少——可能是 1B、1K、1M、1G、80000B 等(单位之前可以是任何自然数)。
这不是输入文件的大小,而是我需要从输入文件中读取多少。如果输入文件小于 DataAmount,我需要重新读取文件,直到我准确读取 DataAmount 字节。
对于过滤,我从输入文件读取到某个缓冲区。我从缓冲区过滤到其他缓冲区中的可打印字符,然后从该缓冲区写入输出文件(两个缓冲区大小相同)。
另一个问题是,我怎样才能确定这两个缓冲区的最佳大小,所以对 read() 和 write() 的调用最少?
(注意:我不会一次写入整个数据,因为它可能太大了,我不会一次写入每个字节。我仅在缓冲区为满)。
目前,我构建的缓冲区大小仅取决于单位:
如果是 B 或 K,大小为 1024。
如果是 M 或 G,则大小为 4096。
这一点都不好,因为对于 1B 和 100000B,我将拥有相同大小的缓冲区。
我该如何改进?
【问题讨论】:
-
总是使用 4096 有什么问题?
-
@jxh 如果我的输入是 1B,那就太大了..
-
我会选择 4096 字节。它是standard size of physical blocks on most machines nowadays,因此这将最大限度地减少您必须实际访问磁盘的次数。较小文件的开销完全可以忽略不计。
-
@ChikChak:那有什么问题?
-
没有。除非您使用的是 RAM 受限的嵌入式控制器等,否则只需使用页面大小即可。