【问题标题】:Why can I only open 2045 files with Tie::File on Windows?为什么我只能在 Windows 上使用 Tie::File 打开 2045 个文件?
【发布时间】:2010-10-15 13:51:01
【问题描述】:

我有以下代码尝试将数组绑定到文件。除了,当我运行这段代码时,它只创建 2045 个文件。这里有什么问题?

#!/usr/bin/perl
use Tie::File;

for (my $i = 0; $i < 10000; $i++) {
    @files{$i} = ();
    tie @{$files{$i}}, 'Tie::File', "files//tiefile$i";
}

编辑:我在窗户上

【问题讨论】:

  • 为什么要让它们全部打开?

标签: windows perl file


【解决方案1】:

您正在累积打开的文件句柄(请参阅ulimit -nsetrlimitRLIMIT_NOFILE/RLIMIT_OFILE),并且您最终达到了 2048 个打开文件描述符的限制(2045 + stdin + stdout + stderr。)

在 Windows 下,您必须重写您的应用程序,以便它在任何时候最多有 2048 个打开文件句柄,因为 2048 个限制是 MSVC 的stdio 中的硬限制(无法修改)。

【讨论】:

  • 如果我使用的是 Windows 和 ActivePerl,是否有等效的命令?
  • msdn.microsoft.com/en-us/library/6e3b887c.aspx 我不确定如何在不编写自己的 XS 或使用 Inline::C 的情况下从 Perl 调用它。
  • 不幸的是,即使 setmaxstdio 也仅限于 2048 个文件句柄。可能需要重写应用程序。
  • 顺便说一句,SetHandleCount 在 win32 中什么都不做:msdn.microsoft.com/en-us/library/aa383722.aspx
  • @ehemient,正确。它已被弃用。硬2048限制来自_setmaxstdio,不能修改。
【解决方案2】:

在 Linux 机器上转到 /etc/security/limits.conf 并添加或修改这些行

* soft nofile 10003
* hard nofile 10003

这会将每个进程可以打开的文件数增加到 10003(请记住,您总是从三个打开开始:stdin、stdout 和 stderr)。

根据您的 cmets,听起来您使用的是 Win32 机器。我找不到增加每个进程打开文件数量的方法,但您可能,而且我强调,可能能够通过fork'ing(这实际上是 Win32 上的线程)来处理这个问题。

【讨论】:

  • 是否有适用于 Windows 的等价物(这就是我正在研究的)?
  • 看起来,虽然 NT/Win32 允许更多打开文件句柄,但 C 运行时的硬限制为 2048,无法扩展。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多