![](/img/trans.png)
[英]How to parse this huge XML file with nested elements using lxml the efficient way?
[英]Efficient way to parse through huge file
我必須解析一個非常大的文件,修改其內容,並將其寫入另一個文件。 我現在擁有的文件與它可能的文件相比並不是那么大,但它仍然很大。
該文件為1.3 GB,包含大約700萬行此格式:
8823192\t/home/pcastr/...
其中\\t
是制表符。 開頭的數字是后面路徑的表觀大小。
我想要一個輸出文件,其行如下所示(采用csv格式):
True,8823192,/home/pcastr/...
第一個值是路徑是否是目錄。
目前,我的代碼看起來像這樣:
with open(filepath, "r") as open_file:
while True:
line = open_file.readline()
if line == "": # Checks for the end of the file
break
size = line.split("\t")[0]
path = line.strip().split("\t")[1]
is_dir = os.path.isdir(path)
streamed_file.write(unicode("{isdir},{size},{path}\n".format(isdir=is_dir, size=size, path=path))
需要注意的是,像這樣的文件會變得非常大,所以我不僅需要快速解決方案,還需要內存高效的解決方案。 我知道這兩種品質之間通常存在權衡,
最大的收獲就是可能來自調用split
每行僅一次
size, path = line.strip().split("\t")
# or ...split("\t", 3)[0:2] if there are extra fields to ignore
您可以通過將輸入文件視為迭代器並使用csv
模塊來至少簡化代碼。 這也可以為您提供加速,因為它不需要顯式調用split
:
with open(filepath, "r") as open_file:
reader = csv.reader(open_file, delimiter="\t")
writer = csv.writer(streamed_file)
for size, path in reader:
is_dir = os.path.isdir(path)
writer.writerow([is_dir, size, path])
通過網絡復制之前壓縮文件可以加快數據處理速度,因為您可以更快地將數據傳輸到腳本中。
您可以將輸入文本文件壓縮在遠程目標系統上嗎? 如果是,您可以使用python支持的算法將其壓縮為格式(模塊zlib,gzip,bz2,lzma,zipfile)
如果沒有,您至少可以在遠程存儲系統上運行腳本來壓縮文件。 接下來,您將讀取該文件並使用其中一個python模塊在內存中解壓縮,然后處理每一行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.