当前位置: 首页 > 知识库问答 >
问题:

在排序日志中查找“重要”条目

毕泽宇
2023-03-14

我有一个由几千个整数组成的日志文件,每个整数都分开到一个新行上。我已经把它解析成一个这样的整数数组,也进行了排序。现在我的问题变成了从日志中找到“重要的”整数--这些整数显示了用户可配置的部分时间。

例如,给定日志,用户可以进行筛选,只看到出现一定比例次数的条目。

目前,我正在扫描整个数组,并计算每个条目出现的次数。肯定有更好的方法吧?

共有1个答案

上官恩
2023-03-14

首先,我需要注意的是,以下只是一个理论上的解决方案,您可能应该使用@MBO提出的。

取排序数组的每m=n/l个元素。只有这些元素才是重要的,因为长度为m的相同元素序列不能适合于i*m(i+1)*m之间。

对于每个元素x,使用二进制搜索在数组中查找其下限和上限。减去索引,您可以知道count,并决定保留或丢弃x作为不重要的。

def find_all_important(l, n):
  m = n / l
  for i = m to l step m:
    x = read_integer_at_offset("data.bin", i)
    lower_bound = find_lower_bound(x, 0, i)
    upper_bound = find_upper_bound(x, i, n)
    if upper_bound - lower_bound >= m:
      report(x)

def find_lower_bound(x, begin, end):
  if end - begin == 0:
    return begin
  mid = (end + begin) / 2
  x = read_integer_at_offset("data.bin", mid)
  if mid < x:
    return find_lower_bound(x, mid + 1, end)
  else:
    return find_lower_bound(x, begin, mid)

作为猜测,与现代硬件上的幼稚O(n)相比,您不会获得任何显著的改进,除非您的文件非常大(数百MBs)。当然,如果您的数据不能放进RAM中,它是可行的。但与优化一样,它可能值得测试。

 类似资料:
  • 我有一个由几千个整数组成的日志文件,每个整数被分成一行。我已经把它解析成一个这样的整数数组,也进行了排序。现在我的问题变成了从这个日志中找到“重要”整数——这些整数显示了一些用户可配置的时间。 例如,给定日志,用户可以过滤到只看到出现一定缩放次数的条目。 目前我正在扫描整个数组,并记录每个条目出现的次数。肯定有更好的方法吗?

  • 问题内容: 我正在开发一个通过Commons使用Log4J的项目。 我正在尝试找到日志文件的路径,但是没有找到合适的方法来从Logger返回日志文件的路径。 有人尝试过吗? 问题答案: 您必须 从根记录器 获取所有附加程序,然后获取日志文件的名称。

  • 问题内容: 让我们 我想按日期和时间键对输出进行排序。 非常感谢你。 问题答案: 对于GNU排序: 按月份按第二列排序(这样,“三月”排在“四月”之前) 在数字模式下按第三列排序(因此,“ 9”位于“ 10”之前) 按第四列排序。 请参见手册中的更多详细信息。

  • 问题内容: SQL查找重复条目(在组内) 我有一个小问题,我不确定修复它的最佳方法是什么,因为我对数据库(Oracle)本身的访问有限。在我们的“ EVENT”表中,我们大约有16万个条目,每个EVENT都有一个GROUPID,而一个普通条目恰好有5行具有相同的GROUPID。由于一个错误,我们目前有几个重复的条目(重复,所以10行而不是5行,只是一个不同的EVENTID。这可能会更改,因此只是<

  • 问题内容: 我试图找到一种基于特定列(id)在数据框中查找重叠数据范围(每行提供的开始/结束日期)的更有效方法。 数据框在“来自”列上排序 我认为有一种方法可以像我一样避免“双重”应用功能… 我使用“应用”功能在所有组上循环,并且在每个组中,每行使用“应用”: 问题答案: 您可以移动列并直接减去日期时间。 分组时应用它可能看起来像 演示版

  • 问题内容: 我有一个LinkedHashMap。我想让Foo的索引为N。除了迭代直到找到它,还有更好的方法吗?: 对于某些操作,我必须通过约50次的索引从映射中获取随机元素。该地图将包含大约20个项目。 谢谢 问题答案: 然后对于带有O(1)的索引N …