【问题标题】:Multiply read text files files don't seem to exist?多读文本文件文件似乎不存在?
【发布时间】:2013-08-14 18:14:00
【问题描述】:

我正在 RHEL5 光泽文件系统上运行批处理作业。许多作业 (13k) 读取相同的文本文件,用于将每个作业定向到不同的数据集。代码如下所示:

with open('dataset-paths.txt') as txt_file: 
    dataset_location = txt_file.readlines()[job_number].strip()

但是对于我的一部分工作,我得到了

IOError: [Errno 2] No such file or directory: 'dataset-paths.txt'

不能同时从多个进程打开同一个文本文件吗?还有什么可能导致这种情况?

【问题讨论】:

  • 有没有修改或删除文件?
  • @user2357112 不,文件没有任何改变,文件只在with块内使用

标签: python distributed-computing


【解决方案1】:

只是一个“随机猜测”,也许错误信息只是误导?

请记住,打开文件的数量是有限制的——或者准确地说是文件描述符的数量。鉴于所涉及的进程数量众多,很有可能在执行期间的某个时间点达到了限制......

【讨论】:

  • cat /proc/sys/fs/file-max 给我 829173,远远超过我正在运行的作业数量(约 18k)
  • @Shep 我不是那种东西的专家,但据我所知,有一个“系统”限制,以及 par user/per group/per process group 限制(s)。在我的系统上,ulimit -Hn -Sn 最多只报告 1024 个打开的文件。而/proc/sys/fs/file-max 远不止于此。
【解决方案2】:

我不知道为什么会这样,可能是文件锁定或打开的文件句柄太多。但是当您打开/与您的文件交互时应用它。它基本上一直在尝试,直到没有错误为止。

result = None
while result is None:
    try:
        # connect perform I/O
        result = get_data(...)
    except:
         pass

【讨论】:

  • 试过这样的事情......不走运,就像在工作期间文件丢失了
  • @Shep 您是否尝试添加超时 (time.sleep(s))?也许文件句柄需要时间来删除或其他东西。我会说大约 2 秒就可以完成这项工作,试一试。
  • 是的,我尝试让它检查 100 次,超时 5 秒
  • 不,同样的问题。我正在考虑限制同时工作的数量(虽然我真的不知道为什么会有帮助)。
  • 注意我可以重现这个错误without even using python
【解决方案3】:

没有理由你需要 13K 作业都读取同一个文件只是为了挑出一行:

dataset_location = txt_file.readlines()[job_number].strip()

读取文件一次,并将 dataset_location 作为参数传递给 13k 个作业中的每一个,效率会更高。

【讨论】:

  • 当然,如果作业是在 python 中生成的,这将起作用,但它们是从只能在作业之间改变一个整数的 bash 脚本生成的……这很丑,但这是唯一可行的解​​决方案我可以想出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多