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
适合用于此类应用程序(打开/关闭数百/数千次),并且只有满足我需求的内存。我正计划这样做,直到我阅读该函数文档中的注释:
由于输出文本连接使字符向量逐行保持最新,因此使用它们相对昂贵,并且通常最好使用匿名文件()连接来收集输出。
答案 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
。