【发布时间】:2009-07-29 05:15:29
【问题描述】:
我创建了一个执行以下操作的应用程序:
- 进行一些计算,写入计算数据到一个文件 - 重复 500,000 次(总共,一个接一个地写入 500,000 个文件) - 再重复 2 次(总共有 150 万个文件写的)。
- 读取文件中的数据,使用文件中的数据进行一些密集计算 - 重复 1,500,000 次迭代(迭代第 1 步中写入的所有文件。)
- 重复第 2 步,迭代 200 次。
每个文件约为 212k,所以总的来说我有 ~300Gb 的数据。在 2.8 Ghz 的 Core 2 Duo CPU 上,整个过程似乎需要大约 40 天。
我的问题是(您可能已经猜到了)是完成整个过程所需的时间。所有计算都是串行的(每个计算都依赖于之前的计算),所以我不能将此过程并行到不同的 CPU 或 PC。我正在尝试考虑如何使流程更高效,并且我很确定大部分开销都用于文件系统访问(duh ...)。每次访问文件时,我都会打开它的句柄,然后在完成读取数据后关闭它。
我改进运行时间的一个想法是使用一个 300Gb 的大文件(或几个 50Gb 的大文件),然后我将只使用一个打开的文件句柄并简单地查找每个相关数据并读取它,但我不是打开和关闭文件句柄的开销。有人可以对此有所了解吗?
我的另一个想法是尝试将文件分组为更大的 ~100Mb 文件,然后每次读取 100Mb 而不是多次读取 212k,但这比上面的想法实现起来要复杂得多。
无论如何,如果有人可以就此给我一些建议或知道如何改进运行时间,我将不胜感激!
谢谢。
分析器更新:
我在进程上运行了一个分析器,看起来计算需要 62% 的运行时间,而文件读取需要 34% 的时间。这意味着即使我奇迹般地将文件 i/o 成本降低了 34 倍,我仍然剩下 24 天,这是一个相当大的改进,但仍然很长:)
【问题讨论】:
-
您是否考虑过将其存储在数据库中?
-
我考虑过,但是这样会不会加快数据提取速度?
-
你说你很确定文件的打开/关闭是一个瓶颈。这是基于分析程序的预感还是更多的一般预感?如果是后者,我会认真建议先分析您的代码。
-
你们是对的,我将运行一些分析并更新问题。
标签: c++ optimization file-io