在Python中保存KDTree对象?

在Python中保存KDTree对象?,python,serialization,numpy,scipy,pickle,Python,Serialization,Numpy,Scipy,Pickle,我正在使用Scipy的KDTree实现来读取一个300mb的大文件。现在,是否有一种方法可以将数据结构保存到磁盘并再次加载,还是每次启动程序时都要从文件中读取原始点并构建数据结构?我正在按如下方式构建KDTree: def buildKDTree(self): self.kdpoints = numpy.fromfile("All", sep=' ') self.kdpoints.shape = self.kdpoints.size / self.NDIM, ND

我正在使用Scipy的KDTree实现来读取一个300mb的大文件。现在,是否有一种方法可以将数据结构保存到磁盘并再次加载,还是每次启动程序时都要从文件中读取原始点并构建数据结构?我正在按如下方式构建KDTree:

def buildKDTree(self):
        self.kdpoints = numpy.fromfile("All", sep=' ')
        self.kdpoints.shape = self.kdpoints.size / self.NDIM, NDIM
        self.kdtree = KDTree(self.kdpoints, leafsize = self.kdpoints.shape[0]+1)
        print "Preparing KDTree... Ready!"

有什么建议吗

KDtree使用嵌套类定义其节点类型(innernode、leafnode)。Pickle仅适用于模块级类定义,因此嵌套类会将其触发:

import cPickle

class Foo(object):
    class Bar(object):
        pass

obj = Foo.Bar()
print obj.__class__
cPickle.dumps(obj)

<class '__main__.Bar'>
cPickle.PicklingError: Can't pickle <class '__main__.Bar'>: attribute lookup __main__.Bar failed
输出:

<class 'scipy.spatial.kdtree.innernode'>
"ccopy_reg\n_reconstructor\np1\n(cscipy.spatial.kdtree\nKDTree\np2\nc_
[3 4] [3 4]

“ccopy_reg\n_重构器\np1\n(cscipy.spatial.kdtree\nKDTree\np2\nc_
[3 4] [3 4]

你尝试过酸洗吗?当我尝试在KDTree对象上使用cPickle时,我的机器出现错误。你也可以为cython cKDTree提供补丁吗?@Denis不幸的是,我没有cKDTree的补丁。某种形式的保存/加载方法应该是可能的,但会更加自定义,因为节点是malloc的d结构,而不是类。不幸的是我得到了一个错误:“调用Python对象时超过了最大递归深度”。公平地说,我的树是在一个1000000长的5d坐标列表上计算的,因为从该数组计算只需要几分钟(我可以通过numpy保存和加载数组本身)我想我不得不接受。非常好的解决方案,这对其他类型有效吗?你如何研究以这种方式公开哪些类型?
<class 'scipy.spatial.kdtree.innernode'>
"ccopy_reg\n_reconstructor\np1\n(cscipy.spatial.kdtree\nKDTree\np2\nc_
[3 4] [3 4]