Windows上的Java / MongoDB消息长度错误,但Linux上没有

时间:2012-09-13 09:48:19

标签: java windows linux mongodb

我们目前正在使用java驱动程序将巨大的JSON文件(~100 MB)导入MongoDB。目前我们将文件拆分为较小的块,因为我们第一次遇到导入整个文件的问题。当然,我们知道MongoDB的最大文档大小为16 MB的限制,但是我们现在导入的块远小于此。

奇怪的是,导入程序在Linux(eclipse)上运行时正常工作,但同样的程序会抛出异常,说明Windows上的“不能说些什么”(eclipse)。 从数据库中观察日志时,错误消息显示为

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

重新运行同一数据集上的导入始终会导致有关消息长度的相同错误消息。我们研究了要导入的文档的大小(使用.toString()。length()) - 导致错误的块只有几KB大。

mongo数据库运行的操作系统没有区别,但取决于执行导入代码的位置(使用相同的java-mongo-driver

1 个答案:

答案 0 :(得分:1)

  

“我们目前正致力于将巨大的JSON文件(~100 MB)导入   MongoDB使用java驱动程序“

我们是在讨论一个包含1000个JSON对象的 OR 1个大小约为100MB的JSON对象吗?因为如果我没记错的话,每个对象的16MB限制不是每个包含1000个JSON对象的JSON文件。

另外!

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

导致错误的块只有几KB大。

如果1835627538确实在kb中,这是相当大的,导致约为1750 GigaBytes !!

要绕过包含1000个JSON对象的JSON文件,为什么不逐行遍历数据文件并以这种方式进行插入?使用我的方法无论数据文件有多大,迭代器只是指向特定行的指针。它不会将WHOLE FILE加载到内存中并插入。

注意:这假设您的数据文件包含1个JSON对象每行

使用Apache Commons IO FileUtils(单击here),您可以使用他们的Line迭代器来迭代您的文件,例如(不完全正常工作的代码,需要导入正确的库):

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();
    }