car*_*arl 9 python file-handling with-statement
我正在运行代码,有时几小时后有时几分钟后会失败并出现错误
OSError: [Errno 24] Too many open files
Run Code Online (Sandbox Code Playgroud)
我在调试这个时遇到了很大的麻烦。错误本身总是由下面代码片段中的标记行触发
try:
with open(filename, 'rb') as f:
contents = f.read() <----- error triggered here
except OSError as e:
print("e = ", e)
raise
else:
# other stuff happens
Run Code Online (Sandbox Code Playgroud)
但是,我在这部分代码中看不到任何问题(对吗?),所以我猜代码的其他部分没有正确关闭文件。然而,虽然我确实经常打开文件,但我总是使用“with”语句打开它们,并且我的理解是,即使发生错误,文件也会被关闭(对吗?)。所以我的代码的另一部分看起来像这样
try:
with tarfile.open(filename + '.tar') as tar:
tar.extractall(path=target_folder)
except tarfile.ReadError as e:
print("e = ", e)
except OSError as e:
print("e = ", e)
else:
# If everything worked, we are done
return
Run Code Online (Sandbox Code Playgroud)
上面的代码确实经常遇到 ReadError,但即使发生这种情况,文件也应该关闭,对吧?所以我只是不明白我怎么会遇到太多打开的文件?抱歉,这对您来说是无法重现的,因为我无法对其进行足够的调试,我只是在这里寻找一些提示,因为我迷路了。任何帮助表示赞赏...
编辑:我在 MacBook 上。这是 ulimit -a 的输出
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1418
virtual memory (kbytes, -v) unlimited
Run Code Online (Sandbox Code Playgroud)
根据 @sj95126 的建议,我将有关 tar 文件的代码更改为确保文件关闭的内容
try:
tar = tarfile.open(filename + '.tar')
tar.extractall(path=target_folder)
except tarfile.ReadError as e:
print("tarfile.ReadError e = ", e)
except OSError as e:
print("e = ", e)
else:
# If everything worked, we are done
return
finally:
print("close tar file")
try:
tar.close()
except:
print("file already closed")
Run Code Online (Sandbox Code Playgroud)
但它并没有解决问题。
在unix/linux系统上有一个命令,您可以使用它来检查总数file locks或open files限制ulimit -a。在@carl的情况下,输出是:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1418
virtual memory (kbytes, -v) unlimited
Run Code Online (Sandbox Code Playgroud)
正如你所看到的open filesorfile locks等于256:
open files (-n) 256
Run Code Online (Sandbox Code Playgroud)
这是一个非常small有价值的
@carl 的档案至少包含超过 256 个文件;所以 python 使用文件处理程序打开每个文件,然后生成一个system file lock(为了在系统上打开文件,您需要文件锁,就像指向该文件的指针;要访问数据,可以做任何您想做的事情)
解决方案是为数字创造open files价值。unlimitedvery big
根据此堆栈答案,这是您可以更改限制的方法
| 归档时间: |
|
| 查看次数: |
11584 次 |
| 最近记录: |