我在ruby(2.0.0 p39474)中执行非常快速的文件访问,并且不断获取异常Too many open files

看了这个线程这里和其他各种来源,我很清楚操作系统限制(在我的系统上设置为1024 )。

执行此文件访问的代码部分是互斥的,并采用以下形式:

File.open( filename, 'w'){|f| Marshal.dump(value, f) }

其中filename可以快速更改,具体取决于调用该部分的线程。 我的理解是这个表单在块之后放弃了它的文件句柄。

我可以验证使用ObjectSpace.each_object(File)打开的File对象的数量。 这报告内存中最多有100个驻留,但只有一个是开放的,正如预期的那样。

此外,异常本身是在ObjectSpace仅报告10-40个File对象时抛出的。 此外,手动垃圾收集无法改善任何这些计数,因为通过插入sleep调用来减慢我的脚本。

我的问题是:

  • 我是否从根本上误解了操作系统限制的性质 - 它是否涵盖了流程的整个生命周期?
    • 如果是这样,在访问 ulimit -n文件后,Web服务器如何避免崩溃?
    • ruby是否在其对象系统之外保留其文件句柄,或者内核在计算“并发”访问时只是非常慢?

编辑20130417: strace表示ruby不会将所有数据写入文件,在执行此操作之前返回并释放互斥锁。 因此,文件处理堆栈直到操作系统限制。

为了解决这个问题,我使用了syswrite / sysread ,同步模式,并在close前调用了flush 这些方法都不起作用。

我的问题因此被修改为: 为什么ruby无法关闭其文件句柄,我怎么能强迫它这样做呢?

===============>>#1 票数:3

使用dtracestrace或系统上的任何等效项,并准确找出正在打开的文件。

请注意,这些可能是套接字。

我同意你粘贴的代码似乎不能导致这个问题,至少,不是没有一个相当奇怪的并发错误。

  ask by Stephen Wattam translate from so

未解决问题?本站智能推荐:

2回复

如何为用户提供文件存储限制?

我正在使用Rails正在开发一个Web应用程序,并想知道是否有人知道跟踪文件存储限制的好方法? 我们希望为用户提供可用于上传文件的特定空间,我们使用回形针在Amazon S3上进行存储。 有什么想法吗? 谢谢
2回复

使用用户输入Ruby打开文件

我从这样的用户获取一个字符串变量: 我想用这个变量来打开一个文件。 我如何实际使用此邮件变量来打开该名称的文件? 谢谢
2回复

如何测试打开Ruby文件的模式类型?

假设您已收到一个打开的File对象,但是您不知道它以哪种模式打开(例如'r','w','w +')。 您将如何确定以哪种模式打开文件? 据我所知,没有为此的IO方法,但是我可能会丢失一些东西。 如果有必要为每种模式编写一个单独的测试,那么理想情况下将是单个方法或一个内衬if语句
1回复

使用File.open从ruby目录中打开文件

我是Ruby的新手,我试图以这样的方式打开文件: 但是我得到“没有这样的文件或目录”(该文件确实存在于该目录中)。 如果我将该路径作为命令行参数放在文件中,例如: 然后从命令行运行,如:ruby script.cgi~ / path / to / file.txt 任何想
1回复

Ruby在哪里跟踪其打开的文件描述符?

这是什么问题不 这个问题不是关于如何使用File #close或File#open block语法自动关闭文件。 这是一个关于Ruby在运行时存储其打开文件描述符列表的问题。 实际问题 如果您的程序具有开放描述符,但您无权访问相关的文件或IO对象,那么如何找到对当前打开的文件
1回复

通过Ruby使用HTTP下载文件:文件无法打开,可能已损坏

我正在使用以下代码段: 如果仅在浏览器中输入puts u.host + "/" + u.path ,则可以清楚地看到该文件。 但是,下载的文件“已损坏”,因此无法打开。 这是什么原因呢? 是因为它来自HTTPS服务器吗? 我该怎么做才能解决此问题?
1回复

如果只在ruby中不存在文件,那么如何打开文件进行写入

我想打开一个文件进行写入,但前提是它尚不存在。 如果文件存在,我想引发异常。 这是最好的方法吗? 没有竞争条件,最惯用的方法是什么?
2回复

打开多个文件,并使用ruby脚本分析每个文件的n(n-1)/ 2个组合

我正在做比较分析。 我有“ x1,x2,... xn”文件。 我希望将每个文件用作单个输入元素,并使用我的脚本进行处理(x1 vs x2,x1 vs x3,.... x(n-1)vs xn)。 这将对n(n-1)/ 2个结果进行n(n-1)/ 2个操作的迭代。 请帮助我以迭代方式打开
1回复

在ruby中,无法从指定位置打开文本文件,也无法打开我自己创建的文件

我有一个文件放置在C:\\ mtn-2 \\ mtn-2.2 \\ logs \\ messages.txt中,如果试图通过脚本打开此文件,它说没有这样的文件或目录,所以我创建了另一个文件.txt在同一位置,并尝试通过ruby脚本打开其工作文件。 messages.txt文件能够手动重命名/修
7回复

如何在Ruby中写入文件?

我需要从数据库中读取数据,然后将其保存在文本文件中。 我怎么能在Ruby中做到这一点? Ruby中有文件管理系统吗?