【发布时间】:2013-10-28 15:30:44
【问题描述】:
我有超过 1000 万个 JSON 格式的文档:
["key": "val2", "key1" : "val", "{\"key\":\"val", \"key2\":\"val2"}"]
在一个文件中。
使用 JAVA Driver API 导入大约需要 3 个小时,同时使用以下功能(一次导入一个 BSON):
public static void importJSONFileToDBUsingJavaDriver(String pathToFile, DB db, String collectionName) {
// open file
FileInputStream fstream = null;
try {
fstream = new FileInputStream(pathToFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("file not exist, exiting");
return;
}
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
// read it line by line
String strLine;
DBCollection newColl = db.getCollection(collectionName);
try {
while ((strLine = br.readLine()) != null) {
// convert line by line to BSON
DBObject bson = (DBObject) JSON.parse(JSONstr);
// insert BSONs to database
try {
newColl.insert(bson);
}
catch (MongoException e) {
// duplicate key
e.printStackTrace();
}
}
br.close();
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
有没有更快的方法?也许,MongoDB 设置可能会影响插入速度? (例如,添加将用作索引的键:“_id”,以便 MongoDB 不必为每个文档创建人工键和索引)或在插入时完全禁用索引创建。 谢谢。
【问题讨论】:
-
您是否尝试过一次解析不止一行?这可以减少初始化 JSON 解析器所花费的总开销。此外,您可以查看替代 BSON/JSON 解析器。 Jackson (jackson.codehaus.org) 以速度极快而闻名,我相信现在有原生的 BSON 支持。它也是可定制的,因此您可以删除/优化解析器的某些功能。
-
另一件事:您可能希望将 json 的解析与解析结果的保存分开。也就是说,这似乎是一个简单的生产者/消费者问题,其中一个线程可能正在读取/解析 JSON 并添加到队列中,而另一个线程从队列中拉出并将 batch 插入到数据库中。我想“一次插入”的方法是你最慢的部分,但如果没有分析就很难知道。
-
也许您应该尝试将实际解析放在不同的线程中。也许您可以使用
Executors.newFixedThreadPool(n),其中n是可以在给定时间1 运行的线程数。
标签: java json performance mongodb import