簡體   English   中英

通過大文件解析的有效方法

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

你可能需要mmap 這里介紹和教程。

作為一種簡化,它意味着您可以像處理RAM一樣處理磁盤上的文件,而無需將整個文件實際讀入RAM。

通過網絡復制之前壓縮文件可以加快數據處理速度,因為您可以更快地將數據傳輸到腳本中。

您可以將輸入文本文件壓縮在遠程目標系統上嗎? 如果是,您可以使用python支持的算法將其壓縮為格式(模塊zlib,gzip,bz2,lzma,zipfile)

如果沒有,您至少可以在遠程存儲系統上運行腳本來壓縮文件。 接下來,您將讀取該文件並使用其中一個python模塊在內存中解壓縮,然后處理每一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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