繁体   English   中英

用Python保存内存。 如何迭代线条并使用200万行文件有效地保存它们?

[英]Save memory in Python. How to iterate over the lines and save them efficiently with a 2million line file?

我有一个以制表符分隔的数据文件,其中包含200多万行和19列。 你可以在US.zip找到它: http//download.geonames.org/export/dump/

我开始运行以下内容,但for l in f.readlines()使用for l in f.readlines() 我知道只是迭代文件应该更有效,所以我在下面发布。 尽管如此,通过这个小优化,我在这个过程中使用了30%的内存,并且只完成了大约6.5%的记录。 看起来,按照这种速度,它将像以前一样耗尽内存。 而且,我的功能非常慢。 我能做些什么来加快速度吗? 每次传递for循环对del对象有帮助吗?

def run():
    from geonames.models import POI
    f = file('data/US.txt')
    for l in f:
        li = l.split('\t')
        try:
            p = POI()
            p.geonameid = li[0]
            p.name = li[1]
            p.asciiname = li[2]
            p.alternatenames = li[3]
            p.point = "POINT(%s %s)" % (li[5], li[4])
            p.feature_class = li[6]
            p.feature_code = li[7]
            p.country_code = li[8]
            p.ccs2 = li[9]
            p.admin1_code = li[10]
            p.admin2_code = li[11]
            p.admin3_code = li[12]
            p.admin4_code = li[13]
            p.population = li[14]
            p.elevation = li[15]
            p.gtopo30 = li[16]
            p.timezone = li[17]
            p.modification_date = li[18]
            p.save()
        except IndexError:
            pass

if __name__ == "__main__":
    run()

编辑,更多细节(显然重要的):

脚本运行时内存消耗量会增加并保存更多行。 方法.save()是一个掺杂的django模型方法,其中包含写入postgreSQL / postgis db的unique_slug片段。

已解决:Django中的DEBUG数据库日志记录会占用内存。

确保Django的DEBUG设置设置为False

这对我来说非常好。 像这样迭代文件或使用xreadlines()将根据需要读取每一行(在幕后进行合理的缓冲)。 随着您阅读越来越多的数据,内存使用率不应该增长。

至于性能,您应该分析您的应用程序。 很可能瓶颈是在更深层次的功能中,如POI.save()

没有理由担心你给我们的数据:当你阅读越来越多的行时,内存消耗会上升吗? 现在将引起担心 - 但是没有迹象表明这会在您显示的代码中发生,假设p.save()将对象保存到某个数据库或文件而不是内存中,当然。 通过添加del语句没有什么可以获得的,因为无论如何内存在循环的每一段都被回收。

如果有一种更快的方式来填充POI实例而不是逐个绑定其属性 - 例如,将这些属性(可能作为关键字参数?位置会更快......)传递给POI构造函数,则可以加快速度。 但是否是这种情况取决于geonames.models模块,其中我什么都不知道,所以我只能提供非常通用的建议 - 例如,如果模块允许你在一个gulp中保存一堆POI,然后制作它们(比如说)每次100个并且将它们保存在一起应该会产生加速(以稍高的内存消耗为代价)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM