什么是匿名文件

时间:2014-02-07 01:17:29

标签: 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)

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

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

  

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

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

  

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

1 个答案:

答案 0 :(得分:5)

我的C非常生疏,所以希望更有经验的人可以纠正我,但我认为你问题的答案“这个匿名文件究竟是什么?它存在于磁盘上,还是只存在于内存中?” / em>是“它存在于磁盘上”

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

一个。在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);

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

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

℃。最后,文件name在第607行取消关联。unlink的文档说:

  

unlink()函数从其中删除path指定的链接   目录并减少文件的链接数   由链接引用。如果那减少        将文件的链接数减少到零,并且没有进程打开文件,然后是与文件关联的所有资源   回收。如果一个或多个进程具有        删除最后一个链接时文件打开,链接被删除,但文件的删除被延迟,直到所有引用都有   已关闭。

因此实际上删除了目录条目,但只要文件被R进程打开,文件就会存在。

d。最后,R_fopen中定义src/main/sysutils.c:135,并在内部调用fopen