[英]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.