popen 是将整个输出加载到内存中还是保存在 tmp 文件中(在磁盘中)?
Does popen load whole output into memory or save in a tmp file(in disk)?
我想用这段代码读取一个非常非常大的压缩文件的一部分(解压后为 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 是否将命令的整个输出加载到内存中?如果没有,popen 是否将命令的整个输出保存在 tmp 文件中(在磁盘中)?如您所见,解压缩的输出会太大。内存和磁盘都无法容纳它。
我只知道popen创建了一个管道
$ 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
I only know that popen creates a pipe.
我知道有两种管道实现方式:
在MS-DOS,整个输出被写入磁盘;然后通过读取文件完成读取。
可能仍然有 (less-known) 个现代操作系统以这种方式工作。
但是,在大多数情况下,都会为管道预留一定的内存。
xz
命令可以写入数据,直到该内存量已满。如果内存已满,xz
将停止,直到内存可用(因为调用 popen()
的程序读取数据)。
如果调用 popen()
的程序从管道读取数据,数据将从内存中删除,以便 xz
可以写入更多数据。
当调用popen()
的程序关闭文件句柄时,写入管道不再起作用;一条错误消息报告给 xz
...
我想用这段代码读取一个非常非常大的压缩文件的一部分(解压后为 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 是否将命令的整个输出加载到内存中?如果没有,popen 是否将命令的整个输出保存在 tmp 文件中(在磁盘中)?如您所见,解压缩的输出会太大。内存和磁盘都无法容纳它。 我只知道popen创建了一个管道
$ 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
I only know that popen creates a pipe.
我知道有两种管道实现方式:
在MS-DOS,整个输出被写入磁盘;然后通过读取文件完成读取。
可能仍然有 (less-known) 个现代操作系统以这种方式工作。
但是,在大多数情况下,都会为管道预留一定的内存。
xz
命令可以写入数据,直到该内存量已满。如果内存已满,xz
将停止,直到内存可用(因为调用 popen()
的程序读取数据)。
如果调用 popen()
的程序从管道读取数据,数据将从内存中删除,以便 xz
可以写入更多数据。
当调用popen()
的程序关闭文件句柄时,写入管道不再起作用;一条错误消息报告给 xz
...