簡體   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