我有多個大型 csv 檔案。每個檔案的大小為 1 GB 到 7 GB。
我所有的檔案都沒有任何標題。它是這種格式。ID,col1,col2,col3
檔案 1 具有這種結構。
1,23,22,27
2,67,29,22
3,34,34,23
檔案 2 具有這種結構。
4,23,22,27
5,67,29,22
6,34,34,23
ie ID 在所有檔案中都是唯一的。
我想將這些檔案合并到一個 csv 檔案中,然后根據 ID 列對行進行排序。生成的檔案大約為 75 GB。它以 ID 開頭1。
1,23,22,27
2,67,29,22
3,34,34,23
4,23,22,27
5,67,29,22
6,34,34,23
目前我正在這樣做。
import pandas as pd
CHUNK_SIZE = 10000000 # Number of Rows
output_file = 'combined.csv'
for csv_file_name in sorted_fnames:
chunk_container = pd.read_csv(csv_file_name, chunksize=CHUNK_SIZE)
print(csv_file_name)
for chunk in chunk_container:
chunk.to_csv(output_file, mode="a", index=False)
然后我像這樣對檔案進行排序。
sort --parallel=2 -t, -k1,1 -n combined.csv > combined_sorted.csv
但是,合并程序非常緩慢。合并檔案需要一個多小時。
注意:我只有 16 GB RAM。這就是我使用分塊選項的原因。
有沒有最快的解決方案?
謝謝
uj5u.com熱心網友回復:
再三考慮,您可以使用hdf5能夠很好地處理大資料的結構:
import pandas as pd
hdf_path = '_combined.h5'
with pd.HDFStore(hdf_path, mode='w', complevel=5, complib='blosc') as store:
for csv_file_name in sorted_fnames:
store.append('data', pd.read_csv(csv_file_name), index=False)
如果需要,您最終可以將其保存回 csv,但使用 hdf5 會更有效
uj5u.com熱心網友回復:
找到了一個快速的解決方案。檔案在幾分鐘而不是幾小時內處理完畢。
以下假設您在所有 csv 檔案中都沒有標題行。如果您有標題行,則需要先將其洗掉。[注意:如果您僅在第一個 csv 檔案中有標題行,則無需修復]
import subprocess
sorted_fnames = ["1.csv",
"2.csv",
"3.csv"]
my_cmd = ['cat'] sorted_fnames
with open('combined.csv', "w") as outfile:
subprocess.run(my_cmd, stdout=outfile)
如果你想排序,你可以使用 sort 命令。
sort --parallel=2 -t, -k1,1 -n combined.csv > combined_sorted.csv
uj5u.com熱心網友回復:
如果這不是您所需要的全部:
$ cat file1 file2
1,23,22,27
2,67,29,22
3,34,34,23
4,23,22,27
5,67,29,22
6,34,34,23
然后編輯您的問題以提供更有用的示例輸入/輸出,這些示例輸入/輸出真正展示了您的要求以及上述不適用于它的地方。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462125.html
上一篇:使用glob串行列印檔案
下一篇:將資料放入R中的特定行順序
