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