gpt4 book ai didi

c++ - I/O 约束性能 - 加速?

转载 作者:太空狗 更新时间:2023-10-29 23:50:44 24 4
gpt4 key购买 nike

我正在编写一个程序,涉及分析最小 0.5GB(最大超过 20GB)的 CSV 文件,我使用 fstreamwhile (getline( fin,line)) {},并在每个逗号分隔的记录上平均花费 17 毫秒。简单的东西。

但是,有很多记录。很明显,该程序是 I/O 绑定(bind)的,但我想知道我是否可以提高 I/O 性能。我不能求助于 OpenMP,因为我会处理 CPU 限制,缓冲这么大的文件也不起作用。所以我可能需要某种管道...

我在 C++ 多线程方面的经验非常少,也从未使用过数据流框架。谁能指出我正确的方向?


更新(12/23/14):

感谢您的所有评论。你是对的,17 毫秒有点多......在做了很多分析(哦,痛苦)之后,我将瓶颈隔离为对每条记录(75 个字符)中的子字符串的迭代。我对 #pragmas 进行了试验,但它的并行化工作量还不够。函数调用的开销是主要的提示 - 现在每条记录 5.41μs,已经移动了一个大块。它很丑,但速度更快。

感谢@ChrisWard1000 的建议。不幸的是,我目前无法控制我正在使用的硬件,但会使用更大的数据集(>20GB CSV)进行分析,看看我如何引入 mmap/多线程解析等。

最佳答案

每条记录 17 毫秒非常高,改进它应该不难,除非您使用的是一些严重过时的硬件。

  1. 升级硬件。 SSD、RAID strip 化和 PCI express 硬盘专为此类事件而设计。

  2. 一次读取较大块的文件,减少 I/O 等待时间。或许首先使用 fread 将大块转储到内存。

  3. 考虑使用 mmap 在硬盘和内存之间映射一个指针。

  4. 最重要的是分析您的代码以查看延迟所在。这对于 I/O 事件来说是出了名的困难,因为它因机器而异,而且在运行时通常会有很大差异。

  5. 您可以尝试添加多线程解析,但我强烈建议您将此作为最后的手段来尝试,并了解这可能会带来很多痛苦。

关于c++ - I/O 约束性能 - 加速?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27618032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com