2012-09-13 43 views
4

我們正在使用java驅動程序將巨大的JSON文件(〜100 MB)導入到MongoDB中。目前我們將文件拆分爲更小的塊,因爲我們首先遇到導入整個文件的問題。當然,我們知道MongoDB的限制是最大文檔大小爲16 MB,但是我們現在導入的塊卻遠遠小於這個塊。Windows上的Java/MongoDB消息長度錯誤但在Linux上不存在

非常奇怪的是,導入過程在Linux(eclipse)上運行時工作正常,但同一個程序會在Windows(eclipse)上拋出一個異常,說「不能說點什麼」。 當從數據庫中觀測日誌,錯誤消息說

> "Thu Sep 13 11:38:48 [conn1] recv(): message len 1835627538 is too 
> large1835627538" 

重新運行在同一數據集進口總是導致關於消息長度相同的錯誤消息。我們調查了要導入的文檔的大小(使用.toString().length()) - 導致錯誤的塊大小隻有幾kB。

這沒有什麼區別哪臺OS蒙戈運行數據庫,而是取決於正在執行的導入代碼中(使用相同的Java-蒙戈驅動

+0

你能發佈異常的完整堆棧跟蹤? – jyemin

+0

不幸的是,這是我們收到的所有mongodb日誌輸出,除了一個空數據庫,其中(邏輯上)在插入文檔時必須創建集合 – bobeye0816

+0

我認爲沒有可重複的測試用例,任何人都無法提供幫助。你可以發佈示例代碼並在某處公開輸入嗎? – jyemin

回答

1

「我們目前正在導入巨大JSON文件(〜100 MB)到 MongoDB中使用Java驅動程序」

我們是在談論含JSON的1000個對象OR 1 JSON對象,它是大小約100MB一個JSON文件?因爲如果我沒有記錯每個對象不是每個16MB的限制包含1000個JSON對象的JSON文件。

另外!

"Thu Sep 13 11:38:48 [conn1] recv(): message len 1835627538 is too 
large1835627538" 

導致只有錯誤是一些大型KB塊。

如果1835627538確實在KB中,那是相當大的,導致約1750千兆字節!

爲了得到一個包含1000個JSON對象的JSON文件,爲什麼不通過一行一行地遍歷數據文件並以這種方式進行插入?用我的方法並不重要你的數據文件是多大,迭代器只是一個指向特定行的指針。它不會將整個文件加載到內存中並插入。

注意:這是假設您的數據文件包含1個JSON對象每行

使用Apache下議院IO文件實用程序(點擊here),你可以用自己的行迭代器遍歷你的文件,例如(不完全工作代碼,需要導入正確的庫):

LineIterator line_iter; 
    try { 
     line_iter = FileUtils.lineIterator(data_file);  
     while (line_iter.hasNext()) { 
      line = line_iter.next(); 

      try { 
        if (line.charAt(0) == '{') 
          this.mongodb.insert(line); 
      } catch (IndexOutOfBoundsException e) {} 
      } 
     } 
     line_iter.close(); // close the iterator 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
+0

這是一個由許多嵌套子jsons組成的大json。我們已經按照您這樣做的方式進行了這種操作,並採用了更多或更少的atomar json元素,導致插入數據庫的一個對象長度最多爲20-30行。關於插入的奇怪之處在於,相同的數據集插入在Linux上工作,並在Windows上給我們提供了錯誤。我們不知道數據庫所指的消息長度是多少,但我們當然不會嘗試插入大小爲1750GB或甚至1750MB的數據,因爲整個文件比較小(在當前測試集上爲15-150MB ) 謝謝。 – bobeye0816

+0

你解決了這個問題嗎? – chutsu

相關問題