【问题标题】:How to find sequence of repetition from a trace file如何从跟踪文件中查找重复序列
【发布时间】:2013-04-07 16:47:04
【问题描述】:

我被分配了一个任务,我需要检测一个给定的应用程序并生成一个跟踪文件,然后从跟踪文件中生成一个序列图。该应用程序是用 python 编写的。该应用程序在方法启动和退出的地方进行了检测。

我的主要目的是找到跟踪文件中的重复模式?

以下是跟踪文件的示例

Entering    get_instance    None    []  None    10:25:30:743000
Entering    __init__    ConfigHandler   ['config_filepath'] 56663624    10:25:30:743000
Entering    _load_config    ConfigHandler   ['path']    56663624    10:25:30:744000
Exited  _load_config    ConfigHandler   True    56663624    10:25:30:746000
Exited  __init__    ConfigHandler   None    56663624    10:25:30:747000
Exited  get_instance    None    <commons.ConfigHandler.ConfigHandler object at 0x0000000003609E48>  None    10:25:30:747000
Entering    __init__    ColumnConverter []  56963312    10:25:30:769000
Exited  __init__    ColumnConverter None    56963312    10:25:30:769000
Entering    __init__    PredicatesFactory   []  56963424    10:25:30:769000
Exited  __init__    PredicatesFactory   None    56963424    10:25:30:769000
Entering    __init__    LogFileConverter    []  56963536    10:25:30:769000
Exited  __init__    LogFileConverter    None    56963536    10:25:30:769000

如何在跟踪文件中查找重复模式?

我的主要目的是找到跟踪文件中的重复模式?

【问题讨论】:

    标签: python data-mining trace pattern-recognition repeat


    【解决方案1】:

    您可以使用 PrefixSpan 算法来查找顺序规则。

    论文:

    http://www.cs.uiuc.edu/~hanj/pdf/span01.pdf

    这个网站有开源的 Java 代码,你可以从中获得灵感:

    http://www.philippe-fournier-viger.com/spmf/index.php?link=documentation.php#examplePrefixSpan

    【讨论】:

      【解决方案2】:

      考虑检查正则表达式以查找模式。

      例如,匹配这样的行:

      Exited  __init__    LogFileConverter    None    56963536    10:25:30:769000
      

      您可以使用以下正则表达式模式:

      >>> import re
      >>> pattern = re.compile('Exited  __init__\s+(\w+)\s+(.*?)\s+(\d+)\s+(\d+:\d+:\d+\d+)')
      >>> matches = re.findall(pattern, text)
      

      稍作修改,你应该能够找到重复的模式。

      【讨论】:

      • 我知道我可以使用正则表达式来匹配模式但是..我想知道是否有一个通用的方法来匹配跟踪文件中的所有重复模式。
      • 我认为您必须至少编写一些正则表达式,它们是相同基本主题的变体。
      【解决方案3】:

      如果您想在前两个字段中查找重复项,可以将它们用作字典键并使用所有匹配行的列表填充它。处理完整个文件后,那些包含多个元素列表的字典条目是重复的。

      #!/usr/bin/env python
      
      import fileinput
      
      def read (line, d=dict()):
          tokens = line.split()
          key = ' '.join(tokens[0:2])
          try:
              d[key].append(line)
          except KeyError:
              d[key] = [line]in v:
          return d
      
      def main ():
          d = dict()
          for line in fileinput.input():
              read(line, d)
          for k  in d:
              v = d[k]
              if len(v) > 1:
                  # print "### %s => %s" % (k, v)   for debugging
                  for l in v:
                      print l,
      
      if __name__ == '__main__':
          main()
      

      示例输出(启用调试打印,以便您了解它打印这些输出的原因):

      ### Exited __init__ => ['Exited  __init__    ConfigHandler   None    56663624    10:25:30:747000\n', 'Exited  __init__    ColumnConverter None    56963312    10:25:30:769000\n', 'Exited  __init__    PredicatesFactory   None    56963424    10:25:30:769000\n', 'Exited  __init__    LogFileConverter    None    56963536    10:25:30:769000\n']
      Exited  __init__    ConfigHandler   None    56663624    10:25:30:747000
      Exited  __init__    ColumnConverter None    56963312    10:25:30:769000
      Exited  __init__    PredicatesFactory   None    56963424    10:25:30:769000
      Exited  __init__    LogFileConverter    None    56963536    10:25:30:769000
      ### Entering __init__ => ["Entering    __init__    ConfigHandler   ['config_filepath'] 56663624    10:25:30:743000\n", 'Entering    __init__    ColumnConverter []  56963312    10:25:30:769000\n', 'Entering    __init__    PredicatesFactory   []  56963424    10:25:30:769000\n', 'Entering    __init__    LogFileConverter    []  56963536    10:25:30:769000\n']
      Entering    __init__    ConfigHandler   ['config_filepath'] 56663624    10:25:30:743000
      Entering    __init__    ColumnConverter []  56963312    10:25:30:769000
      Entering    __init__    PredicatesFactory   []  56963424    10:25:30:769000
      Entering    __init__    LogFileConverter    []  56963536    10:25:30:769000
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-23
        • 2016-02-07
        • 2015-12-25
        • 1970-01-01
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多