需要读取大数据时如何选择最佳缓冲区大小

How to choose the best buffer size when you need read large data

Let's assume a scenario where I have a lot of log files for a given system, let's imagine that it's petabytes of data. This is my scenario.

使用的技术

我的问题

问题

实际上,您不必为了执行任何操作而将所有数据加载到内存中。关注的就看吧。

I have the need to read these files, which are on disk, and do some processing later

稍后加载它们并立即传递给子系统。如果你想显示这些,那么,只需阅读、处理和显示。

What is the best buffer size for me to have the best performance in reading this data and which saves hardware resources such as disk and RAM memory?

为什么要保存磁盘资源,你的文件不在吗?你必须从这里加载数据到 RAM,比如一个特定的日志文件,然后做任何你想做的事,最后全部刷新。重复。

I just don't know if I should choose 64 Kilobytes, 128 Kilobytes, 5 Megabytes, 10 Megabytes, how do I calculate this?

再次加载文件一个一个没有特定数量的数据。

And if this calculation depends on how much available resource I have, then how to calculate from these resources?

无需计算。通过一次专注于一个或两个文件来巧妙地处理 RAM 资源。不关心磁盘资源。

最佳缓冲区大小取决于许多因素,最主要的是硬件。您可以通过选择一种尺寸、测量操作需要多长时间然后选择另一种尺寸、测量、比较来找出最佳尺寸。重复直到找到最佳尺寸。

注意事项:

  • 您需要使用与目标系统相匹配的硬件进行测量才能进行有意义的测量。
  • 您还需要使用与目标任务相当的输入进行测量。您可以通过使用真实数据的子集来减少输入的大小以加快测量速度,但在某些尺寸下它可能会影响测量的质量。
  • 可能会遇到比稍大或稍小的缓冲区更快的局部最大缓冲区大小,但不如其他更大或更小的缓冲区大小快。可以使用通用的全局优化技术来避免陷入寻找最优值的困境,例如模拟退火。
  • 尽管基准测试是一个简单的概念,但实际上很难正确执行。您的测量结果可能会因可能导致目标系统性能差异的偶然因素而产生偏差。环境随机化可能有助于减少这种情况。

可以作为衡量起点的典型大小是系统缓存的大小:

  • 缓存行大小
  • 一级缓存大小
  • 二级缓存大小
  • L3 缓存大小
  • 内存页面大小
  • SSD DRAM 缓存大小

我在 C# 中看到了关于同一问题的 this 答案,基本上缓冲区大小在性能方面并不重要(只要它是一个合理的值)。然后关于 RAM 和磁盘使用情况,无论缓冲区大小如何,您将拥有与 read/write 相同数量的数据。同样,只要您保持在合理的值之间,就不会有问题。