2012-09-11 27 views
2

我有一个文件,就像下面,如何解析特定的数据文件并将其内容集群? Java的

150 event4 
160 event4 
160 event0 
170 event4 
175 event4 
180 event4 
190 event4 
192 event3 
195 event4 
---------- 
---------- 

第一列是在milisecond相应的事件实际发生的时间。所以event4发生在150毫秒。

我有以下工作要做,

  1. 迭代通过行一个接一个。

  2. 如果连续事件之间的间隔小于80毫秒,它们是单个活动的序列。

例如

100 event4 
120 event5 
140 event6 
200 event4 

所有的人都得到了连续的差异不超过80毫秒。 如果差值超过80毫秒,则意味着当前序列结束并开始新序列。 我的目标是对序列进行聚类。并在不同的集群中报告特定事件的数量。因此,在以下示例中,第1组事件4发生了4次,事件5 1和事件6 1次。在第二次集群事件中4次3次和事件5次1次。

100 event4 
120 event5 
140 event6 
200 event4 

300 event4 
320 event4 
340 event4 
400 event5 

我现在正在做的是,

  1. 我做的字符串列表。我解析文件,并测量行间的差距 ,如果它小于80毫秒,我将它们添加到 列表。
  2. 当我发现一个超过80毫秒间隙的事件时,我停止添加并为下一个序列创建一个新列表。
  3. 在将不同列表中的所有序列都列出后,我通过列表遍历 来测量特定事件的数量。

我不知道这是一种有效的方法。我有一些问题。

  • 我不知道在那里有多少个序列集群,所以我想存储特定集群的列表编号为 不是固定的。
  • 事件名称不固定。它可以是event1到event100或事件 1到45.因此,用于存储事件编号的变量数量也不是固定的 。

那么,你们有没有更好的想法?

+0

您的方法听起来总体上可以,但是如果您没有看到代码,就很难判断您是否正确实施了它。如果你想要“测量特定事件的数量”_,你可能不需要实际存储所有数据点到内存中,你可能能够处理每个组,然后丢弃它。 –

+0

@JimGarrison其实我还没有实现代码,只是分享我的想法。 –

回答

1

这不是人们称之为科学中的“聚类”,而只是分组或聚合。除非事件分开的时间过长,否则您可以聚合事件。

至于方法,你正在追求规范的方法。除非数据已经存在于复杂的数据库索引中,否则无法比线性更好。只要它是一个文本文件,除了线性阅读它之外别无他法。

至于数据结构,将它组织为ArrayList<ArrayList<String>>ArrayList<HashMap<String, Integer>>没什么问题,因为事件ID是字符串。内存要求应该适中,可扩展到1G。如果您遇到内存问题,请尝试保留HashSet<String>以仅保留一个每个事件字符串的副本,并将时间转换为数字数据类型。当你有足够的事件时,你应该能够加载几个GB。

其实我没有看到任何重大挑战。

+0

感谢您的回复,我使用了或多或少相同的数据结构。只是有第二个想法,如果它可能会更好。 –

相关问题