Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何正确关闭船长原型以避免内存泄漏?_Python_Capnproto - Fatal编程技术网

Python 如何正确关闭船长原型以避免内存泄漏?

Python 如何正确关闭船长原型以避免内存泄漏?,python,capnproto,Python,Capnproto,我想我有内存问题,我想关闭我用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]

我想我有内存问题,我想关闭我用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格式保存的数据集,我想在提取了所需信息后关闭captian proto文件(以避免内存问题,而不是浪费空间!)。正确的方法是什么

.finish()

方法保证做到这一点?我不必给垃圾收集器打电话……对吗

提前谢谢

参考:


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

简言之,所需的所有数据都在程序内存空间中的适当时间可用,数据的进一步加载由mmap负责


希望这有帮助

为什么你认为你有记忆问题?症状是什么?文件不使用任何内存。您正在将内容读入
capnp_文件
,并将其传递给
DagNode
,然后返回。如果
DagNode
保留引用,则即使您使用完它,内存仍将保留。数据有多大?你试过使用上下文管理器吗?@FrancoMorero我认为没有人能用proto船长做上下文管理器。但我必须承认我没有想到。“我会试试的。”蒂姆·罗伯茨数据集很大。千兆字节。但在操作系统终止我的工作之前,内存分析器一直在增加。这就是我现在直接传递所需字段而不是文件的原因。为什么文件不占用内存?captain proto read是否将内容加载到变量
capnp_文件
?也许一个普通的python文件只是一个指向文件的指针,但是基于我的内存问题,我假设我没有正确地关闭
capnp_文件的内容,但是我需要等待几个小时来进行预处理以测试新代码。将报告发生的情况。我问问题的主要原因是,在我处理完captain proto文件后,我将其加载到
capnp_文件
变量中,我想关闭它(就像在python中使用
f.close()
)。这就是我希望做的,以避免我以前的错误,但也许传递字段isntead将修复我的错误。