微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Python 中解释 Dill 的酸洗跟踪输出? 分析un酸洗/反序列化瓶颈

如何解决如何在 Python 中解释 Dill 的酸洗跟踪输出? 分析un酸洗/反序列化瓶颈

我正在尝试使用 dills 的 dill.detect.trace(True) 功能 - 在酸洗过程中打印跟踪 - 找出为什么我的解酸过程如此缓慢。我还没有找到输出解酸洗痕迹的方法,但我假设这或多或少是酸洗的 1 对 1 反向过程,因此检查酸洗痕迹应该揭示也适用于解酸洗的瓶颈。

但是,我不知道如何解释它的输出。例如:

T4: <class 'foo_package.base.model.BarModel'>
# T4
D2: <dict object at 0x7f7de3832800>
T4: <class 'pathlib.PosixPath'>
# T4
T4: <class 'foo_package.some_module.Bar'>
# T4
D2: <dict object at 0x7f7d206273c0>
T4: <class 'some_package.some_module.Bar.options.Sessionoptions'>
# T4
D2: <dict object at 0x7f7d20384040>
T4: <enum 'ModelType'>
# T4
T4: <enum 'SomeOtherEnum'>
# T4
# D2
D2: <dict object at 0x7f7d206b9ac0>
# D2
T4: <class 'some_package.some_other_module.XyzzyObject'>
# T4
D2: <dict object at 0x7f7d206cb100>
###... and so on...

应该如何解释D2T4# 前缀是什么意思?是否可以找到有关增加(反)序列化时间的循环引用/深度嵌套结构的存在的提示

关于 trace 函数的 Dills 文档仅说明:

trace(boolean)

print a trace through the stack when pickling; useful for debugging

更多背景: (降低XY问题的风险)

我使用 dill 来存储 Python 程序实例的部分状态,以保存分析模型。

(Un)pickling 随着时间的推移变得非常缓慢,我正在努力找出原因。

对于包含大量数据的对象,我已经将具有专用序列化方法(例如 numpy/pyarrow/pandas 对象)的对象存储委托给其他使用 __getstate____setstate__ 的序列化方法。这有点帮助,但反序列化仍然需要 1 到 2 分钟,这大大减慢了调试过程。

解决方法

我是莳萝的作者。 这是从 GitHub 和 PyPI 上的自述文件中复制的...

为了帮助调试酸洗问题,请使用 dill.detect,它提供 像泡菜追踪这样的工具::

>>> import dill.detect
>>> dill.detect.trace(True)
>>> f = dumps(squared)
F1: <function <lambda> at 0x108899e18>
F2: <function _create_function at 0x108db7488>
# F2
Co: <code object <lambda> at 0x10866a270,file "<stdin>",line 1>
F2: <function _create_code at 0x108db7510>
# F2
# Co
D1: <dict object at 0x10862b3f0>
# D1
D2: <dict object at 0x108e42ee8>
# D2
# F1
>>> dill.detect.trace(False)

通过跟踪,我们可以看到 dill 如何通过首先存储来存储 lambda (F1) _create_function,底层代码对​​象 (Co) 和 _create_code (用于处理代码对象),然后我们处理对 全局字典 (D2)。 # 标记实际存储对象的时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。