5

我们目前正在使用 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

4

1 回答 1

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" 

导致错误的块只有一些 kB 大。

如果 1835627538 确实以 kb 为单位,那是相当大的,因为那大约是 ~1750 GigaBytes!

要绕过包含 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();
    }
于 2012-09-30T10:13:06.520 回答