什么是匿名文件

Bro*_*ieG 3 r file

file文档中的一篇文章引起了我的注意:

## We can do the same thing with an anonymous file.
Tfile <- file()
cat("abc\ndef\n", file = Tfile)
readLines(Tfile)
close(Tfile)
Run Code Online (Sandbox Code Playgroud)

这个匿名文件究竟是什么?它是存在于磁盘上还是仅存在于内存中?我对此感兴趣,因为我正在考虑一个可能需要创建/删除数千个临时文件的程序,如果这只发生在内存中,它似乎对系统资源的影响要小得多.

这个linux SO Q似乎暗示这个文件可能是一个真正的磁盘文件,但我不确定这个特定的例子是多么相关.此外,这个大内存文档似乎暗示了一个真正的基于磁盘的存储(虽然我假设file正在使用基于匿名的文件):

还应注意,用户可以通过将""指定为filebacking参数来创建"匿名"文件支持的big.matrix.在这种情况下,后备驻留在临时目录中,并且不会创建描述符文件.这些应该谨慎使用,因为即使是匿名的备份也会使用磁盘空间,最终可能会填满硬盘驱动器.当操作系统认为合适时,手动,由用户或自动删除匿名备份.

或者,如果textConnection适合用于此类应用程序(打开/关闭数百/数千次)并且仅满足我的需求的内存.我正计划这样做,直到我阅读该函数文档中的注释:

由于输出文本连接使字符向量逐行保持最新,因此使用它们相对昂贵,并且通常最好使用匿名文件()连接来收集输出.

Vic*_* K. 5

我的C非常生疏,所以希望更有经验的人能够纠正我,但我想你的问题的答案是"这个匿名文件到底是什么?它存在于磁盘上,还是只存在于内存中?" "它存在于磁盘上".

以下是C级发生的事情(我正在查看http://cran.r-project.org/src/base/R-3/R-3.0.2.tar.gz上的源代码):

A. file_open定义的函数src/main/connections.c:554具有以下与匿名文件相关的逻辑(带有空描述),第565-568行:

if(strlen(con->description) == 0) {
    temp = TRUE;
    name = R_tmpnam("Rf", R_TempDir);
} else name = R_ExpandFileName(con->description);
Run Code Online (Sandbox Code Playgroud)

因此,如果没有提供文件名,则会生成新的临时文件名file.

B.如果文件的名称不相等stdin,则调用R_fopen(name, con->mode)发生在第585行(Win32和UTF8名称存在一些细微之处,但我们现在可以忽略它们).

C.最后,文件name在第607行取消链接.文档unlink说:

unlink()函数从其目录中删除path指定的链接,并减少链接引用的文件的链接数.如果该减量将文件的链接数减少为零,并且没有进程使文件打开,则回收与该文件关联的所有资源.如果一个或多个进程在删除最后一个链接时打开文件,则会删除该链接,但会删除该文件,直到所有对它的引用都已关闭为止.

因此,实际上目录条目被删除但文件存在,只要它由R进程打开即可.

D.最后,R_fopen定义在内部src/main/sysutils.c:135并且只是fopen内部调用.

  • 至于它是在内存中还是在磁盘上,这取决于临时文件的存在位置.许多linux系统将`/ tmp`放在内存中.Windows没有. (2认同)