在C+中读取压缩gz文件(重文件)的有效方法+; 我是C++新手。我正在尝试处理一个gz文件,似乎要花2个小时来处理。是否有一种有效的方法来处理它。快一点的

在C+中读取压缩gz文件(重文件)的有效方法+; 我是C++新手。我正在尝试处理一个gz文件,似乎要花2个小时来处理。是否有一种有效的方法来处理它。快一点的,c++,C++,该文件为8GB。这段代码似乎工作得很好,但它花费了很多时间。有什么简单有效的方法吗 我将两块数据写在一起,这样就不会丢失数据。我试过gzseek,它看起来很麻烦。所以只需读取整个数据两次 有人能提出一个更简单的方法或正确的方法来做这件事吗 FILE *out; gzFile f = gzopen("list.gz","rb"); out = fopen("output.txt", "ab"); while(1) {

该文件为8GB。这段代码似乎工作得很好,但它花费了很多时间。有什么简单有效的方法吗

我将两块数据写在一起,这样就不会丢失数据。我试过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);
文件*out;
gzFile f=gzopen(“list.gz”、“rb”);
out=fopen(“output.txt”、“ab”);
而(1)
{
INTERR;
无符号字符缓冲区[1001];
int bytes_read=gzread(f,缓冲区,1001);
fwrite(缓冲区,sizeof(无符号字符),sizeof(缓冲区),out);
std::ifstream-fin(“output.txt”);
字符串读取线;
while(getline(fin,read_line))
{
/*做点什么*/
}
删除(“output.txt”);
fwrite(缓冲区,sizeof(无符号字符),sizeof(缓冲区),out);
如果(读取的字节数<1000){
if(gzeof(f)){
打破
}
否则{
常量字符*错误字符串;
error\u string=gzerror(f,&err);
如果(错误){
fprintf(标准,“错误:%s.\n”,错误字符串);
退出(退出失败);
}
}
}
fclose(out);
gzclose(f);

大约每千字节未压缩数据执行一次:

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)) { ... }
打开和关闭一个文件非常昂贵。将打开和关闭从循环中取出

对于每千字节的压缩数据,您也要执行一次此操作:

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

,然后在循环中间关闭文件。

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

我将添加两次,以便在继续中不会丢失任何数据。如果我读取前1KB数据并将其存储在文件中并进行处理,然后在下一个1KB数据中,只会复制半行。为了克服这一问题,我将复制两行。有一种更简单的方法可以避免冗余,也不会丢失数据ny data??我想读取gzip文件。所以我认为最好的方法是分块读取并处理它。我可以知道我做错了什么吗??我对C++非常陌生,我已经编辑了我的程序。也许现在它有意义了。