我在这里问了一个问题。简单来说,我的算法需要一个四维数组。大小可达32G。所以我打算将它存储在 MongoDB 中。我已经以我的方式实现了它。由于我之前没用过 MongoDB,所以我的实现太慢了,那么我应该如何在 MongoDB 中存储这个四维数组呢?
一些统计数据:
更新整个阵列需要几个小时(我猜是十多个,因为我没有等待),因为我的阵列大小约为 12*7000*100*500,而我的服务器是 Windows Server 2008 R2 Standard 和 16.0GB 内存cpu 是 Intel(R) Xeon(R) CPU,2.67GHz。我的 mongoDB 版本是 2.4.5
稍微解释一下我的实现。 我的数组有四个维度,分别命名为 z、d、wt、wv。
首先,我为数组元素构造一个字符串。以数组元素 p_z_d_wt_wv[1][2][3][4] 为例,z 为 1,d 为 2,wt 为 3,wv 为 4,我得到一个字符串“1_2_3_4”,它代表 p_z_d_wt_wv[ 1][2][3][4]。然后我将 p_z_d_wt_wv[1][2][3][4] 的值存储在数据库中。所以我的数据如下所示:
{“_id”:{“$oid”:“51e0c6f15a66ea5c32a99773”},“键”:“1_2_3_4”,“值”:113.1232}
{“_id”:{“$oid”:“51e0c6f15a66ea5c32a99774”},“键”:“1_2_3_5”,“值”:11.1243}
任何意见,将不胜感激!
提前谢谢!
下面是我的代码
public class MongoTest {
private Mongo mongo = null;
private DB mmplsa;
private DBCollection p_z_d_wt_wv;
private DBCollection p_z_d_wt_wv_test;
public void init()
{
try{
mongo = new Mongo();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (MongoException e) {
e.printStackTrace();
}
mmplsa = mongo.getDB("mmplsa");
p_z_d_wt_wv = mmplsa.getCollection("p_z_d_wt_wv");
}
public void createIndex()
{
BasicDBObject query = new BasicDBObject("key",1);
p_z_d_wt_wv.ensureIndex(query,null, true);
}
public void add( String key, double value)
{
DBObject element = new BasicDBObject();
element.put("key", key);
element.put("value", value);
p_z_d_wt_wv.insert(element);
}
public Double query(String key)
{
BasicDBObject specific_key = new BasicDBObject("value",1).append("_id", false);
DBObject obj = p_z_d_wt_wv.findOne(new BasicDBObject("key",key),specific_key );
return (Double)obj.get("value");
}
public void update(boolean ifTrainset, String key, double new_value)
{
BasicDBObject query = new BasicDBObject().append("key", key);
BasicDBObject updated_element = new BasicDBObject();
updated_element.append("$set", new BasicDBObject().append("value", new_value));
p_z_d_wt_wv.update(query, updated_element);
}
}