【问题标题】:Memory error on large Shapefile in PythonPython中大型Shapefile的内存错误
【发布时间】:2016-09-22 12:50:24
【问题描述】:
import shapefile
data = shapefile.Reader("data_file.shp")
shapes = data.shapes()

我的问题是,当使用 Pyshp 时,从 Shapefile 阅读器获取形状会给我一个异常 MemoryError

.shp 文件非常大,为 1.2 GB。但是我只使用了我机器 32gB 的 3%,所以我不明白。

我可以采取其他方法吗?可以在 Python 中分块处理文件吗?或者使用一些工具将文件溢出到缝隙中,然后分别处理它们?

【问题讨论】:

    标签: python shapefile pyshp


    【解决方案1】:

    引用 thomas 的 this answer

    您看到的MemoryError 异常是可用内存不足的直接结果。这可能是由 Windows (32bit programs) 施加的每个程序限制为 2GB 或您的计算机上缺少可用 RAM 引起的。 (这个link 是针对上一个问题的)。如果您使用的是 Windows 的 64 位副本,您应该可以使用 64 位的 Python 副本来扩展 2GB。

    因此请尝试使用 64 位 Python 副本或提供有关您的平台和 Python 版本的更多详细信息。

    【讨论】:

    • 尽管可能是对的,但这更像是一个评论而不是一个答案......一行半是一个问题?
    • 我没有足够的评分来发表评论,但我仍然想提供帮助
    • 尼克,你可能是对的。我该怎么说?当我运行 interperter 时,我看到 Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32
    • 这个问题给了我答案,是的,我只有 32 位(哦!)。谢谢,尼克,欢迎来到我们不应该说“谢谢”的网站:-/ 见stackoverflow.com/questions/1405913/…
    • @nick_gabpe 抱歉,如果我听起来像个混蛋,我确实投了赞成票,但仍然认为答案值得改进。
    【解决方案2】:

    虽然我无法对其进行测试,但无论文件大小或内存限制如何,Pyshp 都应该能够读取它。创建Reader 实例不会加载整个文件,只会加载标题信息。

    这里的问题似乎是您使用了shapes() 方法,该方法一次将所有形状信息读入内存。这通常不是问题,但对于这么大的文件来说。作为一般规则,您应该改用iterShapes() 方法,该方法一个一个地读取每个形状。

    import shapefile
    data = shapefile.Reader("data_file.shp")
    for shape in data.iterShapes():
        # do something...
    

    【讨论】:

    • 我可以确认问题不在于对象的创建,而在于shapes() 方法。但是,问题是我使用的是 32 位 Python,它只能处理 32gB 的 RAM。当我安装 64 bot 版本时,问题就消失了。但是,如果iterShapes() 方法一次只将一个形状加载到内存中,那么我当然会使用它
    猜你喜欢
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2013-06-19
    相关资源
    最近更新 更多