小编dud*_*ico的帖子

许多小文件或一个大文件?(或者,打开和关闭文件句柄的开销)(C++)

我创建了一个执行以下操作的应用程序:

  1. 进行一些计算,计算出的数据写入文件 - 重复500,000次(总之,一个接一个地写入500,000个文件) - 重复2次(总共写入1.5 mil文件).
  2. 从文件中读取数据,使用文件中的数据进行一些密集计算 - 重复1,500,000次迭代(迭代在步骤1中写入的所有文件)
  3. 重复步骤2进行200次迭代.

每个文件大约212k,所以我有~300Gb的数据.在具有2.8 Ghz的Core 2 Duo CPU上看起来整个过程需要大约40天.

我的问题是(正如你可能猜到的)是完成整个过程所需的时间.所有计算都是串行的(每个计算都取决于之前的计算),因此我无法将此过程与不同的CPU或PC并行.我正在考虑如何使这个过程更有效率,我很确定大部分开销都用于文件系统访问(呃...).每次我访问文件时,我打开一个句柄,然后在我读完数据后关闭它.

我改善运行时间的一个想法是使用一个300Gb的大文件(或者每个50Gb的几个大文件),然后我只使用一个打开的文件句柄,只需查找每个相关数据并阅读它,但我这不是打开和关闭文件句柄的开销.有人可以对此有所了解吗?

我的另一个想法是尝试将文件分组到更大的~100Mb文件,然后我每次读取100Mb而不是多次212k读取,但这比上面的想法实现起来要复杂得多.

无论如何,如果有人可以给我一些建议或有任何想法如何改善运行时间我会很感激!

谢谢.

Profiler更新:

我在流程上运行了一个分析器,看起来计算占运行时间的62%,文件读取需要34%.这意味着,即使我奇迹般地将文件i/o成本降低了34倍,我仍然留下了24天,这是相当大的改进,但仍然很长时间:)

c++ optimization file-io

17
推荐指数
3
解决办法
1万
查看次数

定义静态const结构

这个问题与Symbian OS有关,但我认为C/C++老手也可以帮助我.我正在为Symbian OS编译一个开源库.使用GCCE编译器,它编译没有错误(经过一些修补:)).我将编译器更改为ARMV5,现在我对静态const结构的定义有多个错误,例如:我有一个结构:

typedef struct Foos{
    int a;
    int b;
} Foos;
Run Code Online (Sandbox Code Playgroud)

以下定义了Foos类型的const结构

static const Foos foo = {
    .a = 1,
    .b = 2,
};
Run Code Online (Sandbox Code Playgroud)

GCCE对此没有任何问题,ARMV5在".a = 1,.b = 2"上出现"预期表达式"错误.从我用Google搜索的内容来看,我认为这种方法在C语言中应该是合法的,但在C++中是非法的,如果是这样的话,那么在C++中声明const结构的可能性是什么?如果情况并非如此,那么任何其他帮助将不胜感激.

提前致谢 :)

c c++ symbian

11
推荐指数
3
解决办法
3万
查看次数

标签 统计

c++ ×2

c ×1

file-io ×1

optimization ×1

symbian ×1