2014-04-17 49 views
0

我想通過一個公共值實現合併兩個大文件(每個文件包含JsonObject的文件)的方法。通過在java中合併兩個JSON文件

第一個文件是這樣的:

{ 
"Age": "34", 
"EmailHash": "2dfa19bf5dc5826c1fe54c2c049a1ff1", 
"Id": 3, 
... 
} 

與第二:

{ 
"LastActivityDate": "2012-10-14T12:17:48.077", 
"ParentId": 34, 
"OwnerUserId": 3, 
} 

我已經實施了閱讀的第一個文件,並採取第一的JSONObject的方法,它需要的Id後如果在第二個文件中有一行包含相同的Id(OwnerUserId == Id),那麼它會將第二個JsonObject附加到第一個文件,否則我會編寫另一個文件,該文件只包含與第一個文件不匹配的行文件。這樣,如果第一個JsonObject具有10個匹配項,則第一個文件的第二行不會查找這些行。

該方法工作正常,但它太慢。 我已經嘗試在mongoDb中加載數據並查詢Db,但它也很慢。 是否有另一種方式來處理這兩個文件?

+0

你是怎麼實現你的方法的?你處理了多少個父母和孩子的記錄? –

+0

可能的重複[如何在MongoDB中執行SQL Join等價物?](http://stackoverflow.com/questions/2350495/how-do-i-perform-the-sql-join-equivalent-in-mongodb) –

+0

第一個文件包含60.000行和第二個文件550.000 我的方法很難解釋,但在高層我總是使用兩個文件,一個讀取數據,第二個將不匹配的行在第二次迭代時,第一個文件的新行將在我創建的最新臨時文件上讀取)。 – ilamaiolo

回答

0

你在做什麼只是一定是該死的緩慢。如果您沒有所有JSON對象的內存,那麼嘗試將數據存儲爲普通的Java對象,這樣您肯定需要更少的內存。

而且還有一種簡單的方法,即使需要更少的內存,只有n通過,其中n是所需內存與可用內存的比率。

i上只考慮帶有id % n == i的對象,並忽略所有其他對象。這樣,假設id很好地分佈在模n上,內存消耗減少了幾乎因子n

如果這個假設不成立,請使用f(id) % n代替,其中f是一些散列函數(隨意詢問您是否需要它)。

0

我已經解決了使用臨時數據庫。 我已經創建了一個索引,其中包含我希望進行合併的關鍵字,這樣我就可以對數據庫進行查詢,並且響應速度非常快。