2015-11-14 35 views
0

我正在计算大型XML文件中属于键(标签)的某些值的频率(例如键“国家”值“USA”,“GER”,“FRA”等发生了多少次) 。我为所有可能的钥匙做这个。地图在Scala中可以包含多少个键是否有限制?

的数据结构使用:

type IntHash=Map[String,Int] 
def IntHash()=Map[String,Int]() 

type IntHash2=Map[String,IntHash] 
def IntHash2()=Map[String,IntHash]() 

var keyfreqs:IntHash2=IntHash2() 

我更新的结构是这样的:

if(current_tag!="name") 
{ 
    var keyfreq=keyfreqs.getOrElse(current_tag,IntHash())           
    keyfreq+=(current_value->(keyfreq.getOrElse(current_value,0)+1)) 
    keyfreqs+=(current_tag->keyfreq) 
} 

所有按键可以在除了名字最几千个不同的值。文件中可能有数十万个不同的名称。正如你所看到的,我不允许计算关键字“name”的可能值,因为如果我这样做,程序将停止工作(keyfreq中的键会丢失)。

地图在Scala中可以包含多少个键是否有限制? (如果我允许名字,但只处理有限数量的记录,则该程序有效。)

+0

你的内存限制。 – Maxim

+0

然后我不明白发生了什么事,因为程序从不抱怨内存不足。非常奇怪的行为:如果我为1000条记录运行它,则按预期生成everthing。如果我为100000条记录运行它,除keyfreqs之外的所有密钥均消失(如果剩余的一个密钥正确,则内容将消失)。这里是整个程序:https://github.com/fideplayerslist/fideplayerslist/blob/master/players.scala(我玩弄MAXCNT) – javachessgui

+0

你的代码太长,并且有许多问题混在一起。我想你有一个错误。尝试创建一小段模拟您的问题的代码,然后我们可以尝试提供帮助。 – Maxim

回答

0

我想我现在已经明白了。

这是GUI编程的诅咒。处理大文件我想持续更新,所以我在一个线程中运行处理并在runLater块中更新。但是,对于线程,您不会注意到处理尚未完成,并且线程仍在运行。

其实我保存了keyfreq记录排序。当记录包含数十万个值时,排序花费了很长时间。因此,只有第一个包含少量值的键被保存,然后程序继续对第二个键进行排序,但它从未完成。所以当我看着保存的按键时,看起来喜欢的所有后续按键都不见了。

我的错误是我认为保存应该立即进行。这是因为Python在某种程度上排序更快,我从来不必面对这个延迟问题。

可能是我没有使用正确的方法,通过键进行排序的映射:

def sortedSerializeIntHash(ih: IntHash): String = { 
    val ih_sorted = ListMap(ih.toSeq.sortWith(_._1 < _._1) : _*) 

    return serializeIntHash(ih_sorted) 
} 
相关问题