2015-11-14 83 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) 
} 
相關問題