【问题标题】:How does one properly close a captain proto struct to avoid memory leaks?如何正确关闭船长原型结构以避免内存泄漏?
【发布时间】:2021-04-28 19:45:56
【问题描述】:

我认为我有内存问题,我想关闭我使用 pycapnp 读取的文件。最好的方法是如何做到这一点?正在做:

    def __getitem__(self, idx: int) -> DagNode:
        # gets the file idx for the value we want
        file_idx = self.get_file_index(idx)
        file_name = self.list_files_current_split[file_idx]
        f = open(file_name)
        capnp_file = dag_api_capnp.Dag.read_packed(f, traversal_limit_in_words=2 ** 64 - 1)
        # do stuff with it
        node = DagNode(capnp_file.field1)
        # close both files
        capnp_file.finish()
        f.close()
        return node

在我的场景中,我有一个以 captian proto 格式保存的数据集,我想在从中提取我需要的信息后关闭 Captain proto 文件(以避免内存问题并且不浪费空间!)。这样做的正确方法是什么,

.finish()

方法保证做到这一点?我不必调用垃圾收集器...对吗?

提前致谢!

参考:

【问题讨论】:

  • 为什么你认为你有记忆问题?有什么症状?文件不使用任何内存。您正在将内容读入capnp_file,然后将其传递给DagNode,然后返回。如果DagNode 保留了一个引用,那么即使你完成了它,内存也会一直存在。数据有多大?
  • 您是否尝试使用上下文管理器?
  • @FrancoMorero 我不认为可以用船长 proto 做一个上下文管理器。但我不得不承认我没有想到。会试试的。
  • @TimRoberts 数据集非常大。千兆字节。但是内存分析器过去一直在增加,直到操作系统杀死了我的工作。这就是为什么我现在直接传递我需要的字段而不是文件的原因。为什么文件不占用内存?船长 proto 读取不会将内容加载到变量capnp_file 中吗?也许一个普通的python文件只是一个指向文件的指针,但根据我的内存问题,我假设我没有正确关闭capnp_file 的内容,但我需要等待几个小时才能进行预处理测试新代码。将报告发生的事情。
  • 我问这个问题的主要原因是因为在我完成了船长原型文件后,我将我加载到内存中的 capnp_file 变量中,我想关闭它(就像我在python 与f.close())。这就是我希望避免之前遇到的错误的方法,但也许传递字段 istead 会修复我的错误。

标签: python capnproto


【解决方案1】:

您是否尝试过 python 内存映射文件支持? mmap 它的工作原理很像 os 处理巨大的交换文件。它非常快速和高效。使用 readBytes 收集数据块(猜猜是 traversal_limit_in_words 吗?)

简而言之,所有需要的数据都可以在您的程序内存空间中的正确时间使用,并且进一步加载数据由 mmap 负责。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2019-06-06
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多