用Python保存内存。如何迭代这些行并使用一个200万行的文件高效地保存它们?

用Python保存内存。如何迭代这些行并使用一个200万行的文件高效地保存它们?,python,django,file,memory-management,Python,Django,File,Memory Management,我有一个选项卡分隔的数据文件,有200多万行和19列。 您可以在美国找到它。zip: 我开始运行以下命令,但是使用了f.readlines()中的l的。我明白,只是在文件上迭代应该更有效,所以我在下面发布。尽管如此,通过这个小优化,我在这个过程中使用了30%的内存,只做了大约6.5%的记录。看起来,以这种速度,它将像以前一样耗尽内存。而且,我的功能非常慢。有什么明显的办法可以加快速度吗?每次通过for循环时,删除对象是否有帮助 def run(): from geonames.model

我有一个选项卡分隔的数据文件,有200多万行和19列。 您可以在美国找到它。zip:

我开始运行以下命令,但是使用了f.readlines()中的l的
。我明白,只是在文件上迭代应该更有效,所以我在下面发布。尽管如此,通过这个小优化,我在这个过程中使用了30%的内存,只做了大约6.5%的记录。看起来,以这种速度,它将像以前一样耗尽内存。而且,我的功能非常慢。有什么明显的办法可以加快速度吗?每次通过
for
循环时,删除
对象是否有帮助

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模型方法,具有唯一的_slug片段,正在写入postgreSQL/postgis数据库


解决方法:Django中的调试数据库日志会消耗内存。

我觉得这很好。像这样迭代文件或使用
xreadlines()
将根据需要读取每一行(在后台使用sane缓冲)。内存使用不应随着读取越来越多的数据而增长


至于性能,你应该配置你的应用程序。最有可能的瓶颈是在更深层次的函数中,如
POI.save()

您提供给我们的数据中没有理由担心:内存消耗是否会随着您阅读越来越多的行而增加?现在,这将是令人担忧的原因——但是没有迹象表明在您所展示的代码中会发生这种情况,假设
p.save()
将对象保存到某个数据库或文件中,而不是内存中。添加
del
语句没有什么实际意义,因为内存在循环的每一段都得到了回收


如果有一种比逐个绑定POI实例的属性更快的方法来填充POI实例,则可以加快速度,例如,将这些属性(可能作为关键字参数?位置将更快…)传递给POI构造函数。但这种情况是否发生取决于
geonames.models
模块,我对该模块一无所知,因此我只能提供非常一般的建议——例如,如果该模块允许您在一次吞咽中保存一堆POI,那么一次将其保存(比如)100,并将其成串保存,应该会产生加速效果(以略高的内存消耗为代价).

确保Django的调试设置设置为False

POI对象是什么样子的?它是否将任何数据存储在内存中?您可以偶尔手动调用垃圾收集器清理内存,这可能会有所帮助。POI对象是一个Django模型,在.save()之后不必再保留我原以为一旦有了新的POI()它就会自动收集p如果只执行简单的插入,那么我建议您批量插入行,也许完全忽略Django ORM(SQLAlchemy会起作用).Yep,看起来这实际上是Django的问题,而不是Python的问题。内存的积累是由于Django的调试日志记录。感谢您的评论。增加的内存消耗是由Django的调试数据库日志记录引起的。我会记住您对未来性能提高的建议。只需将调试设置为Fa正如我们预期的那样,lse将内存使用率稳定在1%。