在C ++中读取压缩gz文件(繁重文件)的有效方法

时间:2014-06-25 16:50:11

标签: c++

我是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);

2 个答案:

答案 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)

如果您有足够的可用虚拟内存,在大多数系统上读取文件的最有效方法是将文件映射到内存,让操作系统的分页处理读取。

执行此操作的过程取决于系统。