簡體   English   中英

使用Python讀取,處理和寫入文件的最有效(或專業)方式?

[英]The most efficient (or professional) way to read, proccess and write a file with Python?

我需要編寫一個python腳本來讀取大日志文件(1GB +),提取每行中的IP地址,存儲這些IP,刪除重復項,在另一個文件中找到與這些IP相關的主機名,並將主機名重寫為包含以下內容的新日志文件原始數據。

現在的問題是:處理內存,文件等的最佳方法是什么? 我的意思是,我看到兩種方法:

  1. 讀取原始日志文件,提取IP並寫入新文件( tmp_IPS.txt ,刪除tmp_IPS.txt ,在另一個文件( hostnames.txt )上逐行搜索這些IP,將結果寫入tmp_IPS.txt ,讀取和重寫原始日志文件。在這種情況下,我將處理更少的IP(無需重復)。
  2. 讀取原始日志文件,讀取IP,並在hostnames.txt上搜索每個IP,在原始日志文件+主機名上寫入行。 在這種情況下,我將處理很多重復的IP。 我也可以將找到的IP和主機名寫到新文件或內存中,但是我真的不知道哪個更好。

我預見到有2種可能的場景可以完成此典型的常見任務,因此我將對它們進行簡短的評論。

方案1)重用日志文件輸入數據進行多個查詢或從中創建一個或多個輸出文件。

  1. 首先測量使用Python內置塊從整個文件中創建有效的內存數據結構要花費多長時間,如果要從整個日志文件中讀取和創建簡單的字典需要花費幾秒鍾的時間,可能值得不浪費更多時間時間編碼一個更復雜的解決方案。

  2. 上一步是非常昂貴的操作嗎? 如果是這種情況,並且您將經常重復使用輸入數據,那么我可能會從中創建一個數據庫(NoSQL或關系數據庫,具體取決於處理類型)。 如果您將非常頻繁地使用日志文件數據,那么這種方法可能是值得的。

場景2)您只想處理一次輸入數據並放棄腳本。

如果是這種情況,最簡單的解決方案就是從龐大的日志文件中提取很少的數據子集,以便您可以盡可能快地進行迭代。 一旦獲得了這些數據,就可以創建完成整個過程的整個腳本,一旦確定腳本已經過測試並准備就緒,就可以讓它運行幾秒鍾(我可以用手指指着它,簡單地運行一下這樣的腳本應該花費不到一分鍾的時間)。

就是說,您已經達到需要處理和解析如此大的日志文件的事實,這表明您也許應該開始考慮以更有效的方式存儲日志數據了……例如,使用諸如kibana或類似。

  1. 您應該閱讀hostnames.txt並使用dict將IP映射到主機名。

  2. 然后,您應該批量讀取文件並使用dict.get()檢查主機名,即host = host_dict.get(ip, None)

  3. 我不確定你說什么

    將主機名重寫為包含原始數據的新日志文件

但是您可以open()一個文件,用

with open('new_logfile', 'a') as logfile:
    logfile.write(data_to_append)

在這種情況下,處理大型日志文件的最有效方法是逐行同時讀取和寫入,以避免將大型文件加載到內存中。 如果hostnames.txt相對較小,則應首先將IP到主機名的映射文件hostnames.txt加載到dict中;否則,應將其加載到dict中。 否則,您應該考慮將映射存儲在索引數據庫中)

您如何計划從temp_IPS.txt刪除重復temp_IPS.txt 簡單地避免將重復的IP地址插入文件(並避免將重復的IP地址存儲在內存中)可能更有意義。

就Python文件I / O的速度而言,它取決於您使用的Python版本。 假設您選擇了Python 3,則循環如下:

for line in file.readlines() :
    # Code to deal with the string on each line

假設您的文件格式正確,則可能非常適合您的用例。

我建議以下策略:

  1. 打開原始文件以供閱讀
  2. 打開一個新文件以存儲所需的輸出以進行寫入
  3. 遍歷原始文件,僅在找到非重復IP時才寫入新文件(這將需要將所有先前找到的IP存儲在內存中)

您可以通過多種方式將IP地址存儲在內存中,某些方式更節省空間,某些方式更節省時間。 這取決於您使用的硬件以及一次讀取多少數據。

暫無
暫無

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

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