在32位系统下使用MongoDB的一点心得
随着互联网的变革,互联网的内容生成方式也逐渐地从网站生成转为用户生成。这种变化不仅仅是内容生成对象的转变那样简单的问题,随之带来的就是互联网数据的大爆炸(big bang)。社交网络的兴起也给互联网相关技术提出了挑战。MongoDB应用广泛,作为一款无关系型数据库产品,它具有伸缩性、高性能、开源、模式开放和基于文档等特性。因此很值得研究。
通过本文,我将与你分享:
1. MongoDB如何申请磁盘空间,采用何种策略申请
2. 印证网上流传的32位平台下MongoDB数据库不能大于2GB的说法
既然MongoDB擅长的是海量数据处理,对它进行研究避免不了使用庞大的数据来做测试。好了,问题来了——上哪找庞大的数据呢?
公司里当然有那么多数据了,可是由于保密方面的要求,不能拿来做测试,更不能写出来。因此我想到了一个好东西——CSDN密码库。
这个200+M的小家伙在年前闹得沸沸扬扬,弄得人人自危,掀起了一场改密码风暴,反正也被公布出来了,拿它来做测试不是很好么?
至于从哪里得到的这个密码库,我就不说了,身为ITer的你一定有办法搞到手的。我的这个版本一共有6428632条数据,每条数据的结构都很简单:
用户名# 密码# 邮箱
分析的时候只需要一行行地读出来,然后按照“#”分割,最后对每一个字段都trim一下就可以了。
我做本次实验使用的平台如下:
Windows XP SP3(当然是32位版啦)
奔腾E5300 CPU
2G内存
首先按照上一篇文章建立了本地的MongoDB服务(文章链接:http://blog.csdn.net/chaijunkun/article/details/7227967)
然后使用MongoDB-Driver操作MongoDB,使用Morphia做ORM。
下面是我写的数据迁移代码(从密码库txt文件存储至MongoDB)
CSDNData.java
package net.csdn.blog.chaijunkun.entities;
import org.bson.types.ObjectId;
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
@Entity(value="users", noClassnameStored=true)
public class CSDNData {
@Id
private ObjectId id;
private Integer idx;
private String userName;
private String password;
private String email;
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
public Integer getIdx() {
return idx;
}
public void setIdx(Integer idx) {
this.idx = idx;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package net.csdn.blog.chaijunkun.entities;
import org.bson.types.ObjectId;
import com.google.code.morphia.annotations.Entity;
import com.google.code.morphia.annotations.Id;
@Entity(value="users", noClassnameStored=true)
public class CSDNData {
@Id
private ObjectId id;
private Integer idx;
private String userName;
private String password;
private String email;
public ObjectId getId() {
return id;
}
public void setId(ObjectId id) {
this.id = id;
}
public Integer getIdx() {
return idx;
}
public void setIdx(Integer idx) {
this.idx = idx;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
在实体中我增加了用于标识文档序号的idx字段。
接下来就是数据转储代码了:
TransformData.java
package net.csdn.blog.chaijunkun;
import java.net.UnknownHostException;
import net.csdn.blog.chaijunkun.entities.CSDNData;
import com.google.code.morphia.Datastore;
import com.google.code.morphia.Key;
import com.google.code.morphia.Morphia;
import com.mongodb.Mongo;
import com.mongodb.MongoException;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;&nbs