首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >popen是将整个输出加载到内存中还是保存在tmp文件中(在磁盘中)?

popen是将整个输出加载到内存中还是保存在tmp文件中(在磁盘中)?
EN

Stack Overflow用户
提问于 2022-03-22 09:23:20
回答 1查看 66关注 0票数 0

我想用这段代码读取一个非常大的压缩文件(如果解压缩的话是119.2 GiB )的一部分。

代码语言:javascript
复制
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(&current_cloudsuite_instr, instr_size, 1, trace_file)

是否在c中将命令的全部输出加载到内存中?如果没有,则popen是否将命令的全部输出保存在tmp文件中(磁盘中)?如您所见,解压缩的输出将太大。内存和磁盘都不能容纳它。我只知道波芬创造了一个烟斗。

代码语言:javascript
复制
$ 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-22 09:45:14

,我只知道波芬会创造一个管道。

我知道有两种管道实现:

在MS上,整个输出被写入磁盘,然后通过读取文件完成读取。

这可能是因为仍然有(不太知名的)现代操作系统以这种方式工作。

然而,在大多数情况下,一定数量的内存是为管道预留的。

xz命令可以写入数据,直到内存量满为止。如果内存已满,xz将停止,直到内存可用(因为名为popen()的程序读取数据)。

如果调用popen()的程序从管道中读取数据,则从内存中删除数据,以便xz可以写入更多的数据。

当调用popen()的程序关闭文件句柄时,写入管道将不再起作用;将错误消息报告给xz .

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71569611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档