【问题标题】:Is there a line length limit for text files created from Perl?从 Perl 创建的文本文件是否有行长限制?
【发布时间】:2010-11-29 17:29:18
【问题描述】:

在编写 Perl 脚本时,我需要在文件的一行中写入以逗号分隔的用户名。

这就是为什么我想知道.txt文件中行的最大大小是否有任何限制。

【问题讨论】:

  • 您希望创建多大的文件?

标签: perl unix file filesystems


【解决方案1】:

文本文件和其他文件一样,换行符和其他字符一样,所以只有通常的文件大小限制适用(旧文件系统的大小限制为 4Gb,文件必须适合磁盘等)

除非您逐行读取它,否则您不会遇到任何读写问题 - 您可能会耗尽内存或遇到各种缓冲区溢出。这可能发生在任何文本编辑器或文本处理程序(例如 sed 或 awk)中,因为与 OS 内核不同,这些行分隔很重要

我建议每行保留一个用户,因为当您使用外部程序处理文件时,阅读起来更自然且不易出错。

【讨论】:

  • 至少 kwrite 和 vi 不受行大小的影响(在 4Mb 单行 XML 文件上测试)
  • 当然是有限制的。它必须适合磁盘,如果您逐行读取它,它必须适合内存。除此之外,您可能需要大文件支持来处理超过 4 Gb 的文件。
  • @brian d foy:由于您在这里的经验比 SO 更丰富,我听从您的建议并玩 Captain Obvious,所以现在我的帖子说磁盘上的文件不应超过该磁盘的大小。叹息。
  • 没有什么是显而易见的。您可能可以在 Perl 中创建一个无法保存到完整磁盘但可以放入程序内存的字符串,并且您可能没有足够的程序内存一次性读取整个文件。当您使用非常大的字符串和文件时,它们是您必须处理的真正问题,但大多数人从未考虑过它们。
  • @brian d foy:好吧,你说了很多正确的话,每个人都应该记住。但是你有没有注意到主题已经从“换行符和操作系统”变成了“处理大文件”?你确定这是正确的方法吗?
【解决方案2】:

您唯一需要担心的是您可以创建的文件的大小以及您可以读取的文件的大小。

计算机对行一无所知,行是对文件中字节的解释。我们决定有一些字符序列来划分行的末尾,然后告诉我们的程序从文件中抓取内容,直到它到达那个序列。对我们来说,这是一条线。

例如,您可以在文本文件中定义一行以逗号结尾:

 $/ = ',';

 while( <DATA> )
    {
    chomp;
    print "Line is: $_\n";
    }

 __DATA__
 a,b,c,d,e,f,g

尽管看起来我在__DATA__ 下只有一行,但这只是因为我们习惯了书籍。电脑不读书。相反,这个程序认为逗号之间的所有内容都是一行:

Line is: a
Line is: b
Line is: c
Line is: d
Line is: e
Line is: f
Line is: g

【讨论】:

    【解决方案3】:

    没有大小限制,除了你的文件系统很可能是 2TB 或其他东西。

    【讨论】:

      【解决方案4】:

      不,在您达到任何文件大小限制之前没有这样的限制。

      【讨论】:

        【解决方案5】:

        我刚刚在 Kwrite 中遇到了一个大约 100 万个字符的行的问题。

        虽然理论上没有限制,但如果要处理文件,则必须将行换行以显示宽度。在每次编辑时,都会执行许多计算,可能涉及交换内存。 Thar 使编辑变得笨拙。排长队可能很不方便。

        【讨论】:

          【解决方案6】:

          在一些旧的 Unix 系统上,一些文本实用程序(例如 join、sort 甚至一些旧的 awk)对最大行大小有限制。我认为这是实用程序的限制,但不是操作系统。据我所知,GNU 实用程序没有这样的限制,因此 Linux 从来没有这个问题。

          【讨论】:

          • 我曾经在旧版本的 IRIX 和 AIX 上遇到过这个问题。然后我在我的主目录中安装了 GNU textutils(未合并到 coreutils),从而解决了问题
          【解决方案7】:

          文件大小取决于您的操作系统的文件系统。工具对此没有限制(或者至少到目前为止我从未见过..)

          【讨论】:

          • 有些工具有限制,因为它们使用四字节的int地址空间,这就是为什么有些工具支持大文件的原因。
          猜你喜欢
          • 1970-01-01
          • 2010-12-23
          • 2011-05-29
          • 1970-01-01
          • 1970-01-01
          • 2011-12-04
          • 2018-01-15
          • 1970-01-01
          相关资源
          最近更新 更多