为什么我的 Perl 程序无法在 Windows 上创建超过 4 GB 的文件?

2023-12-09

为什么输出到文件时文件大小上限为 4 GB 使用打印文件?我希望通过流输出 应该可以生成任意大小的文件。

Update: ijw and 查斯。欧文斯是正确的。我以为F:驱动器是NTFS格式的,但实际上它使用的是FAT32文件系统。我 在另一个驱动器上尝试过,我可以生成 20 GB 的文本 文件。在这种情况下没有限制。向大家道歉。


详细信息:在研究回答此处的问题时 我需要测量 Stack Overflow 的性能 使用 Perl 读取非常大的文本文件。为了测试 阅读我需要一个大文本文件,我写了一个小文本文件 Perl 脚本生成文本文件并遇到 意想不到的问题。输出文件不断增长直至达到 4 GB。根据 Windows 资源管理器,一次运行的大小 脚本大小为 4294967269 字节(磁盘上为 4294967296 字节)。 脚本继续执行,但文件不再增长。

本质上只是一些:

print NUMBERS_OUTFILE $line;

其中 $line 是一个长字符串,末尾带有“\n”。这 线路的长度可以配置,并且对于 这个问题;例如250 个字符或 34000 个字符。 NUMBERS_OUTFILE 是使用以下命令创建的文件句柄:

open ( NUMBERS_OUTFILE,">F:\temp2\out1.txt")

驱动器 F:采用 NTFS 格式,位于单独的物理磁盘上 硬盘来自装有操作系统的磁盘。

原因是什么?有解决方法吗?


Full Perl脚本 and BAT驱动脚本(HTML 格式为 预标记)。如果两个环境变量 MBSIZE 和 OUTFILE 设置完毕后 Perl 脚本应该能够运行 在 Windows 以外的其他平台上保持不变。

平台:ActiveState 的 Perl 5.10.0; 32位;建造1004。 Windows XP x64 SP2、8 GB RAM、500 GB 绿色鱼子酱 硬盘。

perl -V says:

Summary of my perl5 (revision 5 version 10 subversion 0) configuration:
  Platform:
    osname=MSWin32, osvers=5.00, archname=MSWin32-x86-multi-thread
    uname=''
    config_args='undef'
    hint=recommended, useposix=true, d_sigaction=undef
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=undef, use64bitall=undef, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cl', ccflags ='-nologo -GF -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_ST
RICT -DHAVE_DES_FCRYPT -DUSE_SITECUSTOMIZE -DPRIVLIB_LAST_IN_INC -DPERL_IMPLICIT_CONTE
XT -DPERL_IMPLICIT_SYS -DUSE_PERLIO -DPERL_MSVCRT_READFIX',
    optimize='-MD -Zi -DNDEBUG -O1',
    cppflags='-DWIN32'
    ccversion='12.00.8804', gccversion='', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=10
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='__int64', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='link', ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf  -libpath:"D:\Perl\
lib\CORE"  -machine:x86'
    libpth=\lib
    libs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.lib a
dvapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib mpr.l
ib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib
    perllibs=  oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib  comdlg32.l
ib advapi32.lib shell32.lib ole32.lib oleaut32.lib  netapi32.lib uuid.lib ws2_32.lib m
pr.lib winmm.lib  version.lib odbc32.lib odbccp32.lib msvcrt.lib
    libc=msvcrt.lib, so=dll, useshrplib=true, libperl=perl510.lib
    gnulibc_version=''
  Dynamic Linking:
    dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
    cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -debug -opt:ref,icf  -libpat
h:"D:\Perl\lib\CORE"  -machine:x86'


Characteristics of this binary (from libperl):
  Compile-time options: MULTIPLICITY PERL_DONT_CREATE_GVSV
                        PERL_IMPLICIT_CONTEXT PERL_IMPLICIT_SYS
                        PERL_MALLOC_WRAP PL_OP_SLAB_ALLOC USE_ITHREADS
                        USE_LARGE_FILES USE_PERLIO USE_SITECUSTOMIZE
  Locally applied patches:
        ActivePerl Build 1004 [287188]
        33741 avoids segfaults invoking S_raise_signal() (on Linux)
        33763 Win32 process ids can have more than 16 bits
        32809 Load 'loadable object' with non-default file extension
        32728 64-bit fix for Time::Local
  Built under MSWin32
  Compiled at Sep  3 2008 13:16:37
  @INC:
    D:/Perl/site/lib
    D:/Perl/lib
.

嗯,这很奇怪。至少在 OS X 和 Linux 上,该限制是由文件系统施加的。也许 Win32 上的 Activestate Perl 编译时不支持大文件?可以贴一下运行结果吗perl -V?

我们关心的输出部分是

Platform:
osname=MSWin32, osvers=5.00, archname=MSWin32-x86-multi-thread
uname=''
config_args='undef'
hint=recommended, useposix=true, d_sigaction=undef
useithreads=define, usemultiplicity=define
useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
use64bitint=undef, use64bitall=undef, uselongdouble=undef
usemymalloc=n, bincompat5005=undef

具体来说,uselargefiles=define。定义(即打开)此功能的事实意味着 Perl 将使用无符号 64 位整数作为文件偏移量。理论上,文件大小可达 16 艾字节(17,179,869,184 GB);但是,在达到该限制之前,文件系统限制通常会发挥作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 Perl 程序无法在 Windows 上创建超过 4 GB 的文件? 的相关文章

随机推荐

  • Python 中 int 实例的 int 值存储在哪里?

    The intpython 中的 type 提供了两个名为numerator and real具有相同的内容 int 由于所有这 3 个值都返回相同的内部属性 我猜real是这样的属性 property def real self retu
  • 无法链接 CSS 和图像

    我正在开发 Spring Hibernate JSP 应用程序 我正在尝试显示 JSP 页面中的图像 图像未显示在浏览器上 我也无法将我的 CSS 链接到 JSP 页面 我的JSP页面是
  • 单独托管 API 和 IdentityServer4 主机(C#、.NET CORE)有哪些优势? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 也许我要问的问题非常明显和简单 但作为 IdentityServer4 的初学者以及或多或少的 oAuth2 OpenID 和 API 的初学者 我发现它很难理解 我们公司的目标是使用身份
  • 如何跳过ActiveRecord回调? [复制]

    这个问题在这里已经有答案了 可能的重复 如何避免运行 ActiveRecord 回调 我有这样的模型 class Vote lt ActiveRecord Base after save add points to user end 是否有
  • 为什么'LDR'不能用'B'代替?

    我有一个程序 arm 和一些指令 IDA 的 disas plt 000083F0 ADRL R12 0x83F8 plt 000083F8 LDR PC R12 off 90D8 0x83F8 sub 83D0 地址0x90D8存储0x8
  • 尝试通过 AWS SNS 向印度移动发送短信

    我的用例是通过 AWS SNS 向印度移动发送短信 我创建了订阅者并选择了短信协议 对于端点 我提供了我的手机号码 它接受并创建了订阅 我创建了订阅主题以将短信发送到我的手机号码 它显示已发送消息 但我没有收到来自该主题的任何消息 如何在A
  • WordPress:上传时发生错误

    更新到 WordPress 3 5 后 当我以非管理员用户身份使用 添加媒体 按钮上传文件时 开始出现以下错误 错误 上传时发生错误 请稍后再试 图片似乎已完成上传 但最后出现此错误消息 这种情况不会发生在管理员身上 只会发生在其他角色身上
  • 正则表达式来匹配单词

    我正在寻找一个正则表达式 使用 NET 来匹配单词ass 正则表达式不应匹配诸如赋值之类的单词 我怎样才能做到这一点 您正在寻找单词边界 b bass b 这将匹配ass但不是bass or assignment
  • 使用 NSDistributedNotificationCenter for iTunes 获取有关歌曲信息更改的通知

    我知道你可以使用 iTunesDNC addObserver self selector selector updateInfo name com apple iTunes playerInfo object nil 每次播放器更改歌曲 停
  • 运行在 Visual Studio 中添加为资源的 exe 文件

    简单地说 我已将 exe 文件作为资源添加到 Visual Studio 项目中 我如何运行这个文件 我正在用 c 编码 您可以将 Resource 作为 byte byte myResBytes Assembly asm Assembly
  • Flask 在 GAE 上重定向

    您好 我正在 Google 应用引擎上使用 Flask http flask pocoo org 我有以下代码 app route edit html methods GET POST def create if request metho
  • 在 Swift 中处理 XML 元素的属性

    我想阅读url使用 NSXMLParser 来自此元素的属性
  • 如何从 Android 应用程序读取内存数据

    我想从应用程序中获取一些数字数据 但它们不会存储为像 db 这样的文件 我知道有一些内存黑客应用程序可以改变游戏值 尽管我不知道它们是如何工作的 我正在寻找类似的功能 但不需要更改任何内容 我试图编写的应用程序只是从特定应用程序读取一些数据
  • 在 PHP 中使用 array_chunk 移动元素

    我有一个基本数组 其中使用 array chunk 将其分为 3 个元素 array array a b c d e f g h chunk array chunk array 3 结果如下 a b c d e f g h Las chun
  • 如果未实例化成员模板,是否要评估 static_asserts?

    我想我明白了static assert工作了 但是当我在 g 编译器上尝试这个时 我开始想知道 include
  • 错误:关系不存在

    所以问题就在这里 我正在用 java 抓取一些数据 最终我将 java 放入 postgres 数据库中 当我运行 Java 程序时 我收到错误 ERROR 关系 表名 不存在 但是当我亲自在 PGAdmin III 中编写相同的查询时 它
  • 使用 svd 求解欠定 scipy.sparse 矩阵

    Problem 我有一组方程 其中变量用小写变量表示 常量用大写变量表示 A a b B c d C a b c d e 我在具有两列的 pandas DataFrame 中提供了有关这些方程结构的信息 常数 and 变量 E g df p
  • 如何根据 R ggplot2 中的 y 轴值重新排序 x 轴

    我正在尝试根据 y 轴的平均值对错误图上的 x 轴重新排序 我不介意是升序还是降序 我已经应用了基于的解决方案这个帖子 但是由于某种原因 它似乎忽略了reorder命令 你知道这里发生了什么吗 Import data df lt struc
  • Oracle UNION 不同列

    我有两张桌子 看起来像 TABLE 1 COL A int COL B float COL C float TABLE 2 COL A int COL B float 我的查询使用 UNION 将这些表的结果放在一起 但在 TABLE 2
  • 为什么我的 Perl 程序无法在 Windows 上创建超过 4 GB 的文件?

    为什么输出到文件时文件大小上限为 4 GB 使用打印文件 我希望通过流输出 应该可以生成任意大小的文件 Update ijw and 查斯 欧文斯是正确的 我以为F 驱动器是NTFS格式的 但实际上它使用的是FAT32文件系统 我 在另一个