需要帮助管理大文件

时间:2012-01-01 19:23:24

标签: c++ c memory-management file-io linux-kernel

我想阅读4GB文件&通过在某些字段中进行更改来创建它的副本。我的首要任务是时间效率,即处理应该很快 我想将它加载到内存中,以便读/写操作变得快速。我应该用堆?或者我应该尝试其他内存映射文件吗?或任何其他出路?

首先,谢谢大家的贡献...让我重新构思我的问题...在这里你去..
我必须从用户那里得到一个文件,这个文件大约3-4GB。它包含记录,每个记录都有一些字段,其中包含一些敏感数据,我需要搜索并加密它直到EOF ..
如果我使用FILE I / O执行搜索和加密,它将需要永远..作为其批处理......所以我可以在堆上创建一个4GB的数组,因为我在64位操作系统上工作,加载整个文件并执行操作。这个本地副本将提供比FILE IO更好的性能...
我正在考虑内存映射文件,因为它将消除阵列(本地副本)和放大器的需要。操作速度也不错,但我不熟悉它,所以要求上面提到的场景是否合适...... !! 我也在考虑考虑MATLAB ......你也可以建议你是否有更好的出路.. thnx ......

2 个答案:

答案 0 :(得分:3)

我的猜测是采用内存映射方法,但你应该尝试一下并测量什么能为你提供最佳性能。从天真的直接实现开始,如果这还不够好,请尝试优化它。

答案 1 :(得分:1)

解决方案很简单,但需要您提供有关给定文件格式详细信息的更多信息。

然而,一些通用解决方案的伪代码(普通的C,在需要时请求C ++实现):

#define BUFSIZE 4096 // 4k, try larger or smaller values to improve performance...

int process_file( const char* filename ) {
  char buffer[BUFSIZE];
  size_t nread;
  FILE* fp;
  if( (fp=fopen(filename,"rb"))==NULL ) return 1;
  while( (nread=fread(buffer,1,BUFSIZE,fp))>=0 ) {
    if( nread==0 ) break; // EOF
    process_file_buffer( buffer, nread );
  }
  fclose(fp);
  return nread>=0 ? 0 : 2; // 0==success, 2==read error, check "errno"!
}

void process_file_buffer( const char* buffer, size_t size ) {
  // process, and write result to target file
}

修改

关于你的记忆管理问题疑惑:这在很大程度上取决于你的实际代码和你的实际要求。在我的示例代码中,只有一个缓冲区,在堆栈上自动分配,对于该用例来说就足够了。

但是,如果您有特殊要求,请明确询问它们!

另一个编辑:

此代码非常扎实,为更多提供了完美的基础。但是:如果您遇到性能问题,那么您必须运行一个分析器(或者编写和自己的分析代码)。

为什么?

你可能会怀疑这个代码是瓶颈,但我敢打赌它不会;)不要忘记,你还要写一些东西给DISK,不要忘记你必须通过任何文件的单字节通过内存 - 从那里通过CPU寄存器 - 来处理它(这是你的实际要求之一......)。

SO:还不介意内存映射IO。首先,您必须考虑其他任何事情;)

你可能不喜欢听到这个。但这只是你最初的情况。

而且,在开始考虑内存管理之前,您应该开始考虑您的实际I..O ..要求。

另一个编辑:

KISS - 保持简单,愚蠢; - )