簡體   English   中英

加快寫入文件的速度

[英]Speed up writing to files

我已經描述了一些我用cProfile繼承的遺留代碼。 我已經做了一些有幫助的改變(比如使用simplejson的C擴展!)。

基本上,此腳本將數據從一個系統導出到ASCII固定寬度文件。 每行都是一條記錄,它有很多值。 每行7158個字符,包含大量空格。 總記錄數為150萬條記錄。 每行生成一行,並且需要一段時間(每秒5-10行)。

生成每一行時,它盡可能簡單地寫入磁盤。 分析表明file.write()花費了大約19-20%的總時間 對於1,500行的測試用例,即20秒。 我想減少這個數字。

現在看來,下一次勝利將減少寫入磁盤所花費的時間。 如果可能的話,我想減少它。 我可以在內存中保留一個記錄緩存,但我不能等到最后並立即將其全部轉儲。

fd = open(data_file, 'w')
for c, (recordid, values) in enumerate(generatevalues()):
        row = prep_row(recordid, values)
        fd.write(row)
        if c % 117 == 0:
                if limit > 0 and c >= limit:
                        break
                sys.stdout.write('\r%s @ %s' % (str(c + 1).rjust(7), datetime.now()))
                sys.stdout.flush()

我的第一個想法是在列表中保留記錄緩存並分批寫出來。 會更快嗎? 就像是:

rows = []
for c, (recordid, values) in enumerate(generatevalues()):
        rows.append(prep_row(recordid, values))
        if c % 117 == 0:
            fd.write('\n'.join(rows))
            rows = []

我的第二個想法是使用另一個線程,但這讓我想死在里面。

實際上,你的問題不是file.write()需要20%的時間。 它有80%的時間你不在file.write()

寫入磁盤很慢。 你真的無能為力。 將內容寫入磁盤只需要很長的時間。 你幾乎無法做任何事情來加速它。

您想要的是I / O時間是程序的最大部分,因此您的速度受硬盤速度的限制而不是您的處理時間。 理想的是file.write()有100%的使用率!

將寫入分組到500個組中確實可以顯着加快寫入速度。 對於此測試用例,寫入行在I / O中單獨占用21.051秒,而分批寫入117則需要5.685秒來寫入相同數量的行。 500個批次總共只用了0.266秒。

你可以在python中做mmap ,這可能會有所幫助。 但是我懷疑你在分析時犯了一些錯誤,因為在20秒內7k * 1500大約是0.5 Mbytes / s。 做一個你用相同長度編寫隨機行的測試,你會發現它比這快得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM