我有一個大約有 5000 萬行的 CSV 檔案,我正在嘗試操作資料并寫入一個新的 CSV 檔案。這是下面的代碼:
import csv
import itertools
def main():
with open("input.csv", "r") as csvfile:
rows = csv.DictReader(csvfile)
sorted_rows = sorted(rows, key=lambda row: row["name"])
grouping = groupby(sorted_rows, lambda row: row["name"])
with open("output.csv", "w") as final_csvfile:
fieldnames = ["name", "number"]
writer = csv.DictWriter(final_csvfile, fieldnames=fieldnames)
for group, items in grouping:
total = sum(int(item["number"]) for item in items)
writer.writerow(
{
"name": group,
"number": str(total),
}
)
if __name__ == "__main__":
main()
這在不太大量的行上運行良好,但是當我運行具有 5000 萬行的實際 CSV 時,它變得非常慢并且程式最終被殺死。
現在這一行:sorted_rows = sorted(rows, key=lambda row: row["name"])是主要問題,因為它將 5000 萬行加載到記憶體(一個串列)中,以便對其進行排序。我已經明白,首先要做的sorted()是將給定的任何生成器轉換為串列,那么我該怎么做呢?任何指標?
uj5u.com熱心網友回復:
@python_user 上面方法的問題在于它會不斷附加到字典中,在你知道它之前,字典會變得非常大,并且可能會在記憶體方面搞砸。
@Bharel 在評論中說了一些關于外部排序的內容,我查看了它并找到了一種方法。
我發現 UNIX sort 命令可以對非常大的檔案執行外部合并排序,所以我撰寫了一個腳本來對非常大的 CSV 檔案進行排序,然后將排序后的 CSV 檔案傳遞??到問題中的 python 代碼中。這樣,不會有太大的內容寫入記憶體。
這是代碼:
sort.sh
echo "sorting CSV"
sort input.csv -o input.csv
echo "Done!"
上述腳本運行后,然后將排序后的CSV傳遞到程式中:
import csv
from itertools import groupby
def main():
with open("input.csv", "r") as csvfile:
rows = csv.DictReader(csvfile)
grouping = groupby(rows, lambda row: row["name"])
with open("output.csv", "w") as final_csvfile:
fieldnames = ["name", "number"]
writer = csv.DictWriter(final_csvfile, fieldnames=fieldnames)
for group, items in grouping:
total = sum(int(item["number"]) for item in items)
writer.writerow(
{
"name": group,
"number": str(total),
}
)
if __name__ == "__main__":
main()
請注意,問題中使用 sorted() 的行已經消失。我認為這是一個更有效的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342619.html
