[英]Concatenating and sorting thousands of CSV files
我在磁盤上有成千上萬個csv文件。 每個文件的大小約為10MB(約10K列)。 這些列大多數都包含實數(浮點數)。
我想通過串聯這些文件來創建一個數據框。 有了這個數據框后,我想按前兩列對其條目進行排序。
我目前有以下內容:
my_dfs = list()
for ix, file in enumerate(p_files):
my_dfs.append(
pd.read_csv(p_files[ix], sep=':', dtype={'c1' : np.object_, 'c2' : np.object_}))
print("Concatenating files ...")
df_merged= pd.concat(my_dfs)
print("Sorting the result by the first two columns...")
df_merged = df_merged.sort(['videoID', 'frameID'], ascending=[1, 1])
print("Saving it to disk ..")
df_merged.to_csv(p_output, sep=':', index=False)
但這需要很大的內存,以至於我的進程在獲得結果之前被殺死(在日志中,我看到該進程在使用大約10GB的內存時被殺死了)。
我試圖弄清楚它到底在哪里失敗,但是我仍然無法做到(盡管我希望盡快記錄一下標准輸出)
在Pandas中有更好的方法嗎?
將它們加載到數據庫中非常容易,靈活,以便以后進行更改,並利用了數據庫中進行的所有優化工作。 加載后,如果要獲取可迭代的數據,則可以運行以下查詢並完成:
SELECT * FROM my_table ORDER BY column1, column2
我敢肯定,有更多直接的方法可以在sqlite3中加載到sqlite3中,但是如果您不想直接在sqlite中進行加載,可以使用python來利用csv閱讀器作為迭代器來加載數據,因此您只需將少量內存加載到內存中,如下所示:
import csv
import sqlite3
conn = sqlite3.Connection(dbpath)
c = conn.cursor()
for path in paths:
with open(path) as f:
reader = csv.reader(f)
c.executemany("INSERT INTO mytable VALUES (?,?,?)""", reader)
這樣,您就不必在內存中加載過多的東西,並且可以利用sqlite。
之后(如果您想再次在Python中執行此操作),您可以執行以下操作:
import csv
import sqlite3
conn = sqlite3.Connection(dbpath)
c = conn.cursor()
with open(outpath) as f:
writer = csv.writer
writer.writerows(c.execute("SELECT * FROM mytable ORDER BY col1, col2"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.