使用Python读取,处理和写入文件的最有效(或专业)方式?

时间:2018-07-10 01:09:50

标签: python memory file-io

我需要编写python脚本来读取大日志文件(1GB +),提取每行中的IP地址,存储这些IP,删除重复项,在另一个文件中找到与这些IP相关的主机名,并将主机名重写为包含原始数据的新日志文件。

现在的问题是:处理内存,文件等的最佳方法是什么?我的意思是,我看到两种方法:

  1. 读取原始日志文件,提取IP并写入新文件(tmp_IPS.txt,删除重复项,在另一个文件(hostnames.txt上逐行搜索这些IP,将结果写入{{1 }},读取和重写原始日志文件。在这种情况下,我将处理更少的IP(无需重复)。
  2. 读取原始日志文件,读取IP,并在hostnames.txt上搜索每个IP,然后在原始日志文件+主机名上写入行。在这种情况下,我将处理很多重复的IP。我也可以将找到的IP和主机名写到新文件或内存中,但是我真的不知道哪个更好。

4 个答案:

答案 0 :(得分:1)

我预见到了此典型的常见任务的两种可能情况,因此我将对它们进行简短的评论。

场景1):重复使用日志文件输入数据进行多个查询或从中创建一个或多个输出文件。

  1. 首先测量使用Python内置块从整个文件中创建有效的内存数据结构要花费多长时间,如果要从整个日志文件中读取和创建简单的字典需要花费几秒钟的时间可能不值得浪费更多的时间来编写更复杂的解决方案。

  2. 上一步是非常昂贵的操作吗?如果是这样,您将经常重复使用输入数据,我可能会根据它创建一个数据库(NoSQL或关系型,取决于处理类型)。如果您将经常使用日志文件数据,那么这种方式可能会很值得。

方案2)您只想处理一次输入数据并放弃脚本。

如果是这种情况,最简单的解决方案是从庞大的日志文件中提取很少的数据子集,以便您可以尽可能快地进行迭代。一旦获得了这些数据,就可以创建完成整个过程的整个脚本,一旦确定脚本已经过测试并准备就绪,就可以让它运行几秒钟(我可以用手指指着它,简单地运行一下这样的脚本应该花费不到一分钟的时间。

也就是说,您已经达到需要处理和解析大型日志文件这样的事实,这表明您也许应该开始考虑以更有效的方式存储日志数据了……例如,使用诸如此类的解决方案为kibana或类似名称。

答案 1 :(得分:0)

  1. 您应该阅读hostnames.txt并将IP映射到主机名 使用dict

  2. 然后您应该阅读batches中的文件,并使用dict.get()(即host = host_dict.get(ip, None)

  3. )检查主机名。
  4. 我不确定你说的是什么意思

      

    将主机名重写为包含原始数据的新日志文件

但是您可以open()通过以下方式非常简单地附加文件

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

答案 2 :(得分:0)

在这种情况下,处理大型日志文件的最有效方法是逐行同时读取和写入,以避免将大型文件加载到内存中。如果hostnames.txt相对较小,则应首先将IP到主机名的映射文件hostnames.txt加载到字典中。否则,您应该考虑将映射存储在索引数据库中

答案 3 :(得分:0)

您如何计划从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地址存储在内存中,有些可以节省空间,有些可以节省时间。这取决于您使用的硬件以及一次读取多少数据。

相关问题