【问题标题】:Cannot import all .JSON files into MongoDB无法将所有 .JSON 文件导入 MongoDB
【发布时间】:2014-02-21 17:36:30
【问题描述】:

问题已解决:事实证明,我从一开始就没有真正遇到过问题。当我计算记录数以确定我应该导入多少记录时,.json 对象之间的空格被添加到总记录数中。但是,在导入时,仅移动了具有内容的对象。无论如何,我将把这篇文章留在这里以供参考。感谢那些不顾一切做出贡献的人。


我有大约 33GB 的 .JSON 文件,这些文件是从 Twitter 的流 API 中检索到的,存储在本地目录中。我正在尝试将此数据导入 MongoDB 集合。我做了两次尝试:

第一次尝试:单独读取每个文件(约 70 个文件)。这成功导入了 11,171,885/ 22,343,770 个文档。

import json
import glob
from pymongo import MongoClient

directory = '/data/twitter/output/*.json'
client = MongoClient("localhost", 27017)
db = client.twitter
collection = db.test

jsonFiles = glob.glob(directory)
for file in jsonFiles:
        f = open(file, 'r')
        for line in f.read().split("\n"):
                if line:
                        try:
                                lineJson = json.loads(line)
                        except (ValueError, KeyError, TypeError) as e:
                                pass
                        else:
                                postid = collection.insert(lineJson)
                                print 'inserted with id: ' , postid

        f.close()

第二次尝试:将每个 .JSON 文件连接成一个大文件。这成功导入了 11,171,879/ 22,343,770 个文档。

import json
import os
from pymongo import MongoClient
import sys

client = MongoClient("localhost", 27017)
db = client.tweets
collection = db.test

script_dir = os.path.dirname(__file__)
file_path = os.path.join(script_dir, '/data/twitter/blob/historical-tweets.json')

try:
        with open(file_path, 'r') as f:
                for line in f.read().split("\n"):
                        if line:
                                try:
                                        lineJson = json.loads(line)
                                except (ValueError, KeyError, TypeError) as e:
                                        pass
                                else:
                                        postid = collection.insert(lineJson)
                                        print 'inserted with id: ' , postid

                f.close()

python 脚本没有出错并输出回溯,它只是停止运行。关于可能导致这种情况的任何想法?或者任何更有效地导入数据的替代解决方案?提前致谢。

【问题讨论】:

  • 你检查过 mongodb 日志吗?
  • 是的,看来一切运行正常。
  • 所以,它只是突然失败了?你有足够的磁盘空间吗?您确定文件有效并且每一行都是唯一的吗?非常有趣的是,在这两种情况下,基本上都加载了一半的文件。 (如果与问题无关,这是一个非常奇怪的巧合)。
  • 是的,这绝对是一个有趣的情况......这就是为什么我似乎无法将我的想法包裹起来。我有一个我想测试的理论。过去,在 .txt 中打开 .json 文件会将每个 .json 对象放在单独的一行上,并且每条记录之间有一行空格。我想知道计数功能是否将空格添加到总记录中,但是在导入时,只有带有内容的记录被移动。我现在正在导出到 .txt,我会看看我应该真正期望导入多少条记录。

标签: python json mongodb twitter cygwin


【解决方案1】:

您当时正在读取文件一行。每行真的是有效的json吗?如果没有, json.loads 将跟踪,您将使用 pass 语句隐藏该跟踪。

【讨论】:

  • 我完全忽略了这一点。那应该可以解决回溯问题并给我一些想法,但是导入问题很可能会再次发生。该脚本需要相当长的时间才能运行,但一旦到达该点,我将使用回溯编辑我的帖子。谢谢
  • 如果您愿意用其他工具解决问题,您可能想看看 mongoimport:docs.mongodb.org/manual/reference/program/mongoimport "mongoimport 工具提供了从 JSON、CSV 或由 mongoexport 或其他第三方导出工具创建的 TSV 导出。”
  • 这是我的第一个选择,因为它会是一种更有效的方法。然而,Mongoimport/export 函数对被移动的文档有大小限制,这是非常不幸的。
  • 您知道 MongoDB 的最大文档大小为 16MB? docs.mongodb.org/manual/reference/limits
猜你喜欢
  • 2014-10-04
  • 1970-01-01
  • 2020-08-21
  • 2013-02-21
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多