将可重定位的 win32 Perl 减少到尽可能少的文件和字节

Reduce relocatable win32 Perl to as few files and bytes as possible

我正在尝试在 Windows HTCondor 计算集群上使用 perl 程序。 HTCondor on windows 的工作方式是将所有依赖项复制到一个临时目录(用作 chroot 之类的),然后在指定的输出移动到指定位置后删除该目录。

如果我只使用 perl.exe 和 perl514.dll 并做这样的工作:perl -e "print qq/hello\n/" 并告诉集群 运行 它 200 次,然后每次复制都会结束大约需要 15 秒,这是可以接受的开销。那几乎所有的时间都花在了通过网络反复复制文件然后删除它们上。 echo_hello.bat 运行 200 次每次复制需要两秒钟。

我遇到的问题是,当我尝试使用 55MB 和 2,289 个文件的完整 perl 分发时,单个 "hello" 代表需要大约四分钟的复制和删除,这是不可接受的。当我尝试做很多 运行s 时,机器上的磁盘会停止运行,试图同时处理所有代表的所有文件操作,所以它根本不起作用。我不知道最终可能需要多长时间才能完成,因为半小时后我放弃了并且没有完成任何工作。

我想 PAR::Packer 可能会解决这个问题,但没有。我试过 print_hello.exe 是这样创建的:pp -o print_hello.exe -e "print qq/hello\n/"。它仍然使事情陷入停顿,显然是通过淹没文件系统。我认为 PAR::Packer 可执行文件会生成大量临时文件,因为它会从存档中提取所需的文件。我认为 windows 文件系统在有一堆并发的小文件操作时完全窒息。

那么我怎样才能将我构建的 perl 减少到大约 6MB 和十几个文件呢?我实际上只使用了少量的核心模块,不需要 binlib 中的大部分废话,但我不知道如何以理智的方式继续删除内容。

是否有自动删除不需要的文件和模块的方法?

我知道 TCL 有很多工具可以将文件打包到一个未压缩的档案中,然后可以通过 "virtual filesystem" 访问该档案而无需展开文件。有没有办法像使用 PAR 那样使用 perl 本身来做到这一点?问题是 PAR 压缩所有内容,然后必须提取到临时文件,而不是直接通过虚拟文件系统层工作。 (如果我没理解错的话。)

我对perl的使用实际上是作为一个脚本层。它嵌入在模拟中。所以我真的 运行 宁 my_simulation.exe 这取决于 per514.dll,但你明白了。除了使用它之外,我也无法对 HTCondor 集群做任何实际的事情。因此,无需跳出框框思考我应该使用什么而不是 perl,以及我可以在 Windows 和 HTCondor 中进行哪些管理调整,谢谢。

您可以使用非常好的 ListDependencies module

列出您的程序所需的模块

据我所知,它无法在任何地方下载,但很容易复制并粘贴到您自己的 ListDependencies.pm 文件中

您应该阅读模块中的 POD 文档以获取使用说明

您可以使用 Module::ScanDeps 获取 perl 的实际依赖项列表。太糟糕了,当 PAR::Packer 解压整个应用程序时花费了大量时间,所以我决定自己构建可执行文件。

Here 是我准备使用的脚本,它将 perl 依赖项收集到某个目录中;减少 perl 模块的数量可能对您有用,例如通过在复制后手动删除一些依赖项。

理论上(我从未尝试过),下一步可以将所有纯 perl 依赖项合并到单个文件中(如 deps.pm);尽管由于 perl 的自动加载魔法和其他一些技巧,它可能并不平凡。