簡體   English   中英

串聯和排序數千個CSV文件

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

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