我是C ++的新手。我试图处理一个gz文件,似乎需要花费近2小时来完成处理。有没有一种有效的方法来处理它。更快的东西。
该文件为8GB。这段代码似乎工作正常,但它花了很多时间。任何简单有效的方法???
我将2块数据写在一起,这样就不会丢失数据。我试过gzseek,看起来很麻烦。所以只需阅读整个数据两次。
有人可以提出更简单的方法或正确的方法吗?
FILE *out;
gzFile f = gzopen("list.gz","rb");
out = fopen("output.txt", "ab");
while(1)
{
int err;
unsigned char buffer[1001];
int bytes_read = gzread (f, buffer, 1001);
fwrite(buffer,sizeof(unsigned char),sizeof(buffer),out);
std::ifstream fin("output.txt");
string read_line;
while (getline(fin, read_line))
{
/* Do something */
}
remove("output.txt");
fwrite(buffer,sizeof(unsigned char),sizeof(buffer),out);
if (bytes_read < 1000) {
if (gzeof (f)) {
break;
}
else {
const char * error_string;
error_string = gzerror (f, & err);
if (err) {
fprintf (stderr, "Error: %s.\n", error_string);
exit (EXIT_FAILURE);
}
}
}
fclose(out);
gzclose (f);
答案 0 :(得分:2)
每千字节未压缩数据执行此操作一次:
out = fopen("output.txt", "ab");
fwrite(buffer,sizeof(unsigned char),sizeof(buffer),out);
fclose(out);
打开和关闭文件非常昂贵。提升打开和关闭循环。
每千字节压缩数据也会这样做一次:
std::ifstream fin("output.txt");
string read_line;
while (getline(fin, read_line)) { ... }
按照行:
执行此操作一次remove("output.txt");
out = fopen("output.txt", "ab");
fwrite(buffer,sizeof(unsigned char),sizeof(buffer),out);
fclose(out);
然后在循环中间关闭文件。
答案 1 :(得分:1)
如果您有足够的可用虚拟内存,在大多数系统上读取文件的最有效方法是将文件映射到内存,让操作系统的分页处理读取。
执行此操作的过程取决于系统。