我有兩個巨大的 json 檔案(每個 20GB),我需要加入它們。這些檔案具有以下內容:
file_1.json = [{"key": "value"}, {...}]
file_2.json = [{"key": "value"}, {...}]
然而,主要問題是我需要所有 dict 都在同一個串列中。我嘗試在 python 中執行此操作,但不幸的是,我沒有記憶體來執行此操作。
所以,我想也許我可以用 unix 命令解決這個問題,方法是在第一個檔案中替換]for , (注意逗號后面有一個空格)并[從第二個檔案中洗掉。然后,我將使用catunix 命令連接這兩個檔案。
有沒有辦法讓我只編輯 unix 中的最后 10 個字符?
我嘗試使用echo,tr但我可能在語法上做錯了什么。
uj5u.com熱心網友回復:
您可以很容易地附加到檔案中,即在末尾添加字符而不重寫已經存在的資料。使用正確的工具(truncate如果您的系統有它),您可以在適當的位置截斷檔案,即在末尾洗掉字符而不重寫保留的資料。使用正確的工具(dd如果您喜歡冒險的話),您可以用相同長度的字串替換檔案的一部分,而無需重寫未更改的部分。另一方面,您不能在不重寫檔案的情況下從檔案的開頭或中間洗掉字符(這里有一些不相關的例外情況)。
但無論如何重寫這兩個檔案對你沒有多大幫助。您至少需要重寫第二個檔案的內容以將其附加到第一個檔案。
如果您不需要保留拆分檔案,則可以在注意中間標點符號后將第二個檔案附加到第一個檔案中。從第一個檔案中洗掉最后一個]字符,以及任何后續空格和換行符。假設第一個檔案以]換行符結尾,并且您擁有 GNU 核心實用程式(例如非嵌入式 Linux):
truncate -s -2 file_1.json
現在,您可以在第一個檔案中添加逗號和可選的換行符,并附加第二個檔案中的資料而不附加其第一個字符。
echo , >>file_1.json
tail -c 2 file_2.json >>file_1.json
如果您想保持原始檔案不被修改,您可以復制第一個檔案并截斷??它。或者您可以直接制作第一個檔案的截斷副本(仍然假設 GNU coreutils):
head -c -2 file_1.json >concatenated.json
echo , >>concatenated.json
tail -c 2 file_2.json >>concatenated.json
如果您更熟悉 Python,則可以在 Python 中完成所有這些操作。只是不要一次讀取整個檔案,即不要以一次讀取所有行的方式呼叫read()或使用readline()。相反,一次讀取和處理一行(如果行很短)或單個資料塊。未經測驗的代碼:
with open('concatenated.json', 'wb') as out:
with open('file_1.json', 'rb') as inp:
buf = bytes(1024)
size = inp.seek(-len(buf), io.SEEK_END)
n = inp.readinto(buf)
m = re.search(rb']\s*\Z', buf)
stop_at = m.start()
inp.seek(0, io.SEEK_SET)
n = inp.readinto(buf)
total = n
while n > 0:
out.write(buf)
n = inp.readinto(buf)
total = n
if total > stop_at:
out.write(buf[:len(buf)-(total-stop_at)])
n = 0
out.write(b',')
with open('file_2.json', 'rb') as inp:
buf = bytes(1024)
n = inp.readinto(buf)
assert buf[0] == b'['
buf[0:1] = b'\n'
while n > 0:
out.write(buf)
n = inp.readinto(buf)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/468648.html
