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

bob*_*816 5 java linux windows 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"
Run Code Online (Sandbox Code Playgroud)

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

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

chu*_*tsu 1

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

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

还!

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

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

如果 1835627538 确实以 kb 为单位,那就相当大了,因为大约有 1750 GB!

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

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

使用 Apache Commons IO FileUtils(单击此处),您可以使用其 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();
    }
Run Code Online (Sandbox Code Playgroud)