我想阅读4GB文件&通过在某些字段中进行更改来创建它的副本。我的首要任务是时间效率,即处理应该很快 我想将它加载到内存中,以便读/写操作变得快速。我应该用堆?或者我应该尝试其他内存映射文件吗?或任何其他出路?
首先,谢谢大家的贡献...让我重新构思我的问题...在这里你去..
我必须从用户那里得到一个文件,这个文件大约3-4GB。它包含记录,每个记录都有一些字段,其中包含一些敏感数据,我需要搜索并加密它直到EOF ..
如果我使用FILE I / O执行搜索和加密,它将需要永远..作为其批处理......所以我可以在堆上创建一个4GB的数组,因为我在64位操作系统上工作,加载整个文件并执行操作。这个本地副本将提供比FILE IO更好的性能...
我正在考虑内存映射文件,因为它将消除阵列(本地副本)和放大器的需要。操作速度也不错,但我不熟悉它,所以要求上面提到的场景是否合适...... !!
我也在考虑考虑MATLAB ......你也可以建议你是否有更好的出路.. thnx ......
答案 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 - 保持简单,愚蠢; - )