我的python程序是从txt文件中读取数据并将数据插入到我的postgre数据库中。该程序已经启动并继续运行。然后我意外地删除了磁盘上的文件,但程序仍然在运行并将数据插入数据库。
是因为当python打开文件时,它会将文件加载到内存中,这样即使我删除磁盘上的文件,它也不会影响正在运行的程序?但我的文件超过3GB,python真的将我的文件加载到内存中吗?我担心数据库中的数据是否正确。
以下是我打开文件的代码:
f = open("/home/minjian/Documents/tweets2009-07.txt")
我的操作系统是:
Linux minjian-OptiPlex-9020 3.16.0-46-generic #62~14.04.1-Ubuntu SMP Tue Aug 11 16:27:16 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
答案 0 :(得分:1)
与POSIX兼容的操作系统将实际文件 data 保留在磁盘上,直到所有文件句柄都关闭,即使没有任何链接指向数据。
答案 1 :(得分:0)
文件的路径不是文件,删除该路径不会“删除磁盘上的文件”。您访问该文件的路径仅仅是该文件的链接。当python通过该链接打开文件时,它可以访问该文件,随后删除链接(例如, x = data.frame( x1=c(1:500), x2 = rnorm(n=500, sd = 30) )
y = x$x1[1:250] * 2 + x$x1[251:500] /2 + x$x2 /2 +
arima.sim( list(ar=c(0.5,0.3), ma=c(0.8)), n = 500 )
ar_model = arima(y, order=c(2,0,1), xreg=x)
x1 = x$x1
seg_model = segmented(ar_model, seg.Z=~x1, psi=c(400),
control=seg.control(display=FALSE, K=1, random=TRUE))
predict.segmented(seg_model, data.frame(x1=c(1:500),x2=c(1:500)))
)不会改变python对文件的访问。在删除所有引用之前,文件系统不会删除该文件,包括正在运行的进程所持有的引用。
该文件未已加载到内存中。它仍然只是坐在磁盘上。
答案 2 :(得分:0)
大多数文件系统不会删除文件内容,只会删除对文件的引用。当新文件请求旧文件的空间或工具明确覆盖空闲空间时,内容将被删除。
让我用NTFS解释一下。文件首先是MFT(主文件表)中的条目。它就像一个索引,说有一个名为" xyz"并且可以在地址0x87-0x95找到。删除文件时,将删除索引条目,但不会删除地址0x87-0x95中的内容。你的程序从打开文件时就知道这些地址,因此它仍然可以读取它们,甚至索引条目也不再存在。
答案 3 :(得分:-1)
Python不会将文件加载到内存中,除非你告诉它。
当你的python程序打开文件时,它会创建一个链接,这个链接是linux / unix到文件处理的关键。
列出目录并查看文件时,您将看到该目录与该文件的链接。删除文件时,实际上是删除了该链接。然后操作系统注意到该文件没有更多链接,因此删除它。在这种情况下,当您删除文件时,python程序仍然有一个链接,因此该文件仍然在磁盘上,但您无法在其目录中看到它,因为该链接已消失。当你的python程序关闭文件句柄或退出时,python要求操作系统删除它对文件的链接,操作系统注意这是最后一个链接,文件已经消失。
您可以使用ln命令创建链接,以便文件出现在两个目录中。如果你执行ls -l,权限之后左边的数字就是硬链接的数量。