【发布时间】: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