我想用这段代码读取一个非常大的压缩文件(如果解压缩的话是119.2 GiB )的一部分。
FILE* trace_file;
char gunzip_command[1000];
sprintf(gunzip_command, "gunzip -c %s", argv[i]); // argv[i]: file path
trace_file = popen(gunzip_command, "r");
fread(¤t_cloudsuite_instr, instr_size, 1, trace_file)是否在c中将命令的全部输出加载到内存中?如果没有,则popen是否将命令的全部输出保存在tmp文件中(磁盘中)?如您所见,解压缩的输出将太大。内存和磁盘都不能容纳它。我只知道波芬创造了一个烟斗。
$ xz -l 649.fotonik3d_s-1B.champsimtrace.xz
Strms Blocks Compressed Uncompressed Ratio Check Filename
1 1 24.1 MiB 119.2 GiB 0.000 CRC64 649.fotonik3d_s-1B.champsimtrace.xz发布于 2022-03-22 09:45:14
,我只知道波芬会创造一个管道。
我知道有两种管道实现:
在MS上,整个输出被写入磁盘,然后通过读取文件完成读取。
这可能是因为仍然有(不太知名的)现代操作系统以这种方式工作。
然而,在大多数情况下,一定数量的内存是为管道预留的。
xz命令可以写入数据,直到内存量满为止。如果内存已满,xz将停止,直到内存可用(因为名为popen()的程序读取数据)。
如果调用popen()的程序从管道中读取数据,则从内存中删除数据,以便xz可以写入更多的数据。
当调用popen()的程序关闭文件句柄时,写入管道将不再起作用;将错误消息报告给xz .
https://stackoverflow.com/questions/71569611
复制相似问题