【问题标题】:How to choose the best buffer size when you need read large data需要读取大数据时如何选择最佳缓冲区大小
【发布时间】:2021-08-24 13:33:56
【问题描述】:

让我们假设一个给定系统有很多日志文件的场景,假设它是 PB 级的数据。这是我的场景。

二手技术

  • 出于我的目的,我将选择 C/C++ 来执行此操作。

我的问题

  • 我需要读取磁盘上的这些文件,然后再进行一些处理,无论是将它们发送到某个发布/订阅系统上的主题,还是只是在屏幕上显示这些日志。

问题

  • 对于我来说,在读取此数据时获得最佳性能并节省磁盘和 RAM 内存等硬件资源的最佳缓冲区大小是多少?
  • 我只是不知道我应该选择64 KB、128 KB、5 MB、10 MB,如何计算?
  • 如果这个计算取决于我有多少可用资源,那么如何从这些资源中计算?

【问题讨论】:

  • 这取决于你对它进行什么样的处理。您希望针对起点和终点之间的吞吐量对其进行优化。
  • 你有没有考虑过内存映射文件,即Unix/Linux下的mmap()
  • “最好”是适应条件的——要做好不是一件容易的事。从stdio.hBUFSIZ 开始,然后从那里调整。

标签: c performance buffer


【解决方案1】:

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

注意事项:

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

可能是一个很好的衡量起点的典型大小是系统上缓存的大小:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      实际上,您不必为了做任何事情而将所有数据加载到内存中。您只需要阅读相关的内容即可。

      我需要读取这些文件,这些文件在磁盘上,稍后再做一些处理

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

      对于我来说,在读取此数据时获得最佳性能并节省磁盘和 RAM 内存等硬件资源的最佳缓冲区大小是多少?

      你为什么要保存磁盘资源,你的文件不在哪里?您必须将数据从这里以小数量加载到 RAM 中,例如特定的日志文件,然后做任何您想做的事情,最后将其全部刷新。重复。

      我只是不知道我应该选择 64 KB、128 KB、5 兆字节、10 兆字节,我该如何计算?

      再次一一加载文件,不存在特定数量的数据。

      如果这个计算取决于我有多少可用资源,那么如何从这些资源中计算?

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

      【讨论】:

        猜你喜欢
        • 2010-12-05
        • 2014-10-07
        • 1970-01-01
        • 2014-08-19
        • 1970-01-01
        • 2013-03-10
        • 2014-08-22
        • 1970-01-01
        • 2018-10-14
        相关资源
        最近更新 更多