【发布时间】:2020-06-07 01:57:29
【问题描述】:
作为 python 新手,我的任务是找到在 Python 中解析大型日志文件的最快方法。
这些是我迄今为止尝试过的方法,它们给了我 33 到 43 秒的处理时间。 这个耗时最长,为 43 秒:
tflines1 = tfile.readlines()
time_data_count = 0
for line in tflines1:
if 'TIME_DATA' in line :
time_data_count += 1
if time_data_count > 20 :
print("time_data complete")
else:
print("incomplete time_data data")
这个平均耗时 34 秒:
with open(filename) as f:
time_data_count = 0
while True:
memcap = f.read(102400)
memcaplist = memcap.split("\n")
for line in memcaplist:
if 'TIME_DATA' in line:
time_data_count += 1
if not memcap:
break
这个平均 36 秒:
with open(filename, 'r', buffering=102400) as f:
time_data_count = 0
for line in f:
if 'TIME_DATA' in line:
time_data_count += 1
这个平均 36 秒:
logfile = open(filename)
time_data_count = 0
for line in logfile:
if 'TIME_DATA' in line:
time_data_count += 1
最快的是这个在 26.8 秒内完成任务的,我不知道为什么它是最快的。我不明白是什么让它如此特别。有了这个和我指定字节的其他类似文件,我担心可能有一两个文件在字节块之间分割一行,而我正在寻找的字符串被分成两半。这将导致错误的计数。如何解决这个问题:
with open(filename) as f:
time_data_count = 0
while True:
memcap = f.read(102400)
time_data_count += memcap.count('TIME_DATA')
if not memcap:
break
if time_data_count > 20:
print("time_data complete")
else:
print("incomplete time_data data")
无论如何,老板告诉我要研究其他可能使事情变得更快的方法。他建议列表理解和以二进制形式读取文件对象。我认为列表理解不会有太大帮助,并且能够从文件中提取我需要的数据。我觉得将文件作为二进制文件读取会产生额外的代码行和代码需要知道何时预测某些字符的问题。甚至以二进制形式读取文件会有所不同吗?这不是可以使用指针的 c++。
我简要阅读了并行化,但我不确定这是否适用于我们的用例。我需要跟踪某些字符串出现了多少次,所以我不确定当你想跟踪事物的数量时如何将文件拆分为不同的线程。这甚至可能吗?
@TimPeters 这里是使用二进制文件和 seek() 对最终方法的编辑:
with open(filename, 'rb') as f:
time_data_count = 0
while True:
memcap = f.read(102400)
f.seek(-tdatlength, 1)
time_data_count += memcap.count(b'TIME_DATA')
if not memcap:
break
if time_data_count > 20:
print("time_data complete")
else:
print("incomplete time_data data")
我尝试的另一种方法:
with open(filename, 'rb', buffering=102400) as f:
time_data_count = 0
#ask tenzin about seek in this situation
for line in f:
if b'TIME_DATA' in line:
time_data_count += 1
f.seek(-tdatlength, 2)
if time_data_count > 20:
print("time_data complete")
else:
print("incomplete time_data data")
print(time_data_count)
【问题讨论】:
-
日志文件是什么样的?如果您可以在文件中找到
TIME_DATA的时间/位置找到模式,这可能会有所帮助。 -
@JayMody 肯定是有规律的。这有什么帮助?
-
这取决于格式/模式,但一个简单的例子是
TIME_DATA只出现在奇数行上,这会将您的搜索减少一半。很难说它有什么帮助,这完全取决于文件的实际外观。 -
@JayMody 我刚刚检查过,虽然有一个模式,但它是不规则的,因为这些日志来自工厂,有时数据不完整,具体取决于可用的项目类型。这使得预测它会在哪里发生(奇数或偶数)变得困难。事实上,这就是我正在编写的测试的重点,以便能够在 time_data 未完成时进行捕捉。虽然到目前为止我看到的日志文件数量很多,但通过搜索文件,我可以看到 time_data 行之前的前面的正文长度不同或以相同的字符结尾。
-
如果您运行
grep -F -c string file或find /c string file(取决于操作系统),您是否看到任何加速?试图确定 CPU 使用率是这里的问题还是 I/O。 Grep 和 find 是 CPU 使用率的下限。
标签: python python-3.x