gpt4 book ai didi

julia - 如何创建一个 sys 镜像,该镜像具有多个包,其预编译函数缓存在 julia 中?

转载 作者:行者123 更新时间:2023-12-04 13:37:13 24 4
gpt4 key购买 nike

假设我们有一个包符号数组 packages::Vector{Symbol} = [...]我们想使用 PackageCompiler.jl 创建一个 sys 镜像.我们可以简单地使用

using PackageCompiler

create_sysimage(packages; incremental = false, sysimage_path = "custom_sys.dll"

但是如果没有 precompile_execution_file,这将是不值得的。

注意:Linux 上的 sysimage_path = "custom_sys.so"和 macOS 上的 "custom_sys.dylib"...

对于 precompile_execution_file,我认为为每个包运行测试可能会这样做,所以我做了这样的事情:

预编译.jl
packages = [...]

@assert typeof(packages) == Vector{Symbol}

import Pkg

m = Module()
try Pkg.test.(Base.require.(m, packages)) catch ; end

try catch 用于当某些测试出现错误并且我们不希望它失败时。

然后,在 shell 中执行以下命令,
using PackageCompiler

packages = [...]

Pkg.add.(String.(packages))
Pkg.update()
Pkg.build.(String.(packages))

create_sysimage(packages; incremental = false,
sysimage_path = "custom_sys.dll",
precompile_execution_file = "precompilation.jl")


生成了一个加载没有问题的 sys 图像动态库。当我做 using Makie ,没有延迟,所以这部分很好,但是当我和 Makie 一起做一些绘图时,仍然有第一次绘图延迟,所以我猜预编译脚本没有做我认为它会做的事情。

此外,当使用 tab 在 repl 中获取建议时,它会第一次卡住,但我猜这是预期的副作用。

最佳答案

您的 precompilation.jl 存在一些问题脚本,使测试抛出您看不到的错误,因为 try...catch .

但是,虽然为每个包运行测试可能是一个好主意,但我认为它不能如此简单地工作还有更深层次的原因:

  • Pkg.test产生一个新的进程,在其中实际运行测试。我不认为 PackageCompiler可以看到在这个单独的过程中发生了什么。
  • 为了避免这种情况,您可能只想简单地 include()每个包裹的test/runtests.jl文件。但这也可能会失败,因为缺少 test-specific dependencies .

  • 所以我想说的是,为了让所有包可靠且系统地工作,您必须重新实现(或重新使用,如果可以的话) Pkg.test 的一些内部逻辑。为了将所有特定于测试的依赖项添加到当前环境。

    话虽如此,一些包具有现成的预编译脚本,有助于做到这一点。 Makie 就是这种情况,它在其文档中建议使用以下文件来构建系统镜像:
    joinpath(pkgdir(Makie), "test", "test_for_precompile.jl")

    关于julia - 如何创建一个 sys 镜像,该镜像具有多个包,其预编译函数缓存在 julia 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61176508/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com