Scala中地图可以包含多少个键是否有限制?

时间:2015-11-14 13:27:06

标签: scala dictionary key

我正在计算大型XML文件中属于键(标签)的某些值的频率(对于“国家/地区”键,“USA”,“GER”,“FRA”等值的次数是多少次)。我为所有可能的键执行此操作。

我使用的数据结构:

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”的可能值,因为如果我这样做,程序将停止工作(keyfreqs中的键丢失)。

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

1 个答案:

答案 0 :(得分:0)

我想我现在已经知道了。

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

实际上我保存了已分类的keyfreq记录。当记录包含数十万个值时,排序需要很长时间。因此只保存了包含少量值的第一个键,然后程序继续对第二个键进行排序,但它从未完成。因此,当我查看保存的密钥时,看起来所有后续密钥都丢失了。

我的错误是我认为拯救应该立即发生。这是因为在Python中某种程度上排序更快,我从来没有遇到过这种延迟问题。

可能是我没有使用正确的方法按键对地图进行排序:

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

   return serializeIntHash(ih_sorted)
}