-----------------------LOG4J 编码------------------------------------
log4j输出日志到文件,如果不指定编码的话在liunx平台下默认文件编码为ascii,所以如果日志是中文的话
将会是乱码。解决方法:
用log4j输入日志,在linux系统下输出的日志里的中文字符都变成了??等乱码,这是因为在没有显式指明编码的情况下,它会按操作系统的编码进行输出。因此,只要在log4j.properties 文件中加上一句,
log4j.appender.logfile.encoding=UTF-8就可以了!
如果是xml格式的配置文件,配置如下:
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="/home/surenyong/h2wlog.txt"/>
<param name="Threshold" value="ALL"/>
<param name="MaxFileSize" value="500KB"/>
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.log4j.PatternLayout" />
</appender>
疑问:但是我试了试发现如果只是制定为utf-8时还是出现乱码,后来发现原来我输出日志的java文件的编码为ascii,可是由于是在jbuider中编程所以没有办法更改单个的java文件编码,后将utf-8改为gbk后发现行了,但在liunx中日志文件的格式显示为iso8859.
-----------------------------
nohup java -jar yyshw_fat.jar 1 >1.txt &
----------------------------------
java 内存溢出问题:
在wap网页排重的过程中对每个wap页面得分后生成的文件如下:
10,60702
9,7245
8,15009
7,51406
6,14470
5,31407
4,33031
3,11890
2,32335
1,71321
15,65133
14,56115
13,766
12,50916
其中前一个为id,后一个为score,要按照score对其分组,即得分相同的id分到一组中
程序如下:
public Map sort()throws Exception{
HashMap<Integer,List> map=new HashMap<Integer,List>();
BufferedReader reader = new BufferedReader(new InputStreamReader(
SortService.class.getResourceAsStream("sum.txt")));
String line = null;
while ((line = reader.readLine()) != null) {
if(!(line.trim().equals(""))){
String str[]=line.split(",");
int idstr=Integer.parseInt(str[0]);
int scorestr=Integer.parseInt(str[1]);
List list=(List)map.get(scorestr);
System.out.println(idstr);
if(list==null){
list=new ArrayList();
list.add(idstr);
map.put(scorestr, list);
}else{
list.add(idstr);
}
}
}
reader.close();
return map;
}
当运行到id为2350000左右的时候发生内存溢出
------------------------------------
mysql + java 乱码问题的解决
mysql 的编码比较麻烦,他的编码有好几层:字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
连接级如果不指定编码则为latin1编码。
服务器级、数据库级、表级 这三级中如果服务器级没加特别的设置的话那他默认是latin1编码的,以后在建库见表都是默认latin1编码
当然 三个级别不一定编码要一样,可以服务器是latin1 ,数据库是gb2312 ,表是utf-8
一般来说:表的编码默认=库的编码默认=服务器编码。当然如果服务器编码为latin1,然而在建库的时候指定编码为gb2312,那么再建表的时候
如果不指定编码则默认=库的编码 为gb2312,即默认为最邻近的上层编码 。
如果表的编码为gb2312,那当用jdbc连库时应该在建connction时这样写:
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test3?user=root&password=123456&useUnicode=true&characterEncoding=GB2312");
指定连接编码为gb2312,则如果是java string 是中文的话,那么无需进行编码转化即可正确写入表中。
如果表的编码为latin1,那么jdbc连库时应该在建connction时这样写:
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test3?user=root&password=123456");
即用默认的latin1编码连接数据库,然而如果string 是中文的话必须进行编码转化:
pstm.setString(1, new String(info.getCity().getBytes("gb2312"),"iso8859-1"));
也即是说表的编码是什么就应该以什么样的编码去链接库。如果表的编码不支持中文(如:latin1)写库和读库则要进行编码转化,如果支持中文(如:gb2312)不用进行编码转化只需在连库的时候指定正确的编码。
另外注意:如果表的编码为gb2312等(非latin1),在mysql 客户端或控制台,察看表内容时:一定要先指定连接编码为表的编码,如:gb2312等。 指定的语句如下 :SET CHARACTER SET gb2312;这样才能保证,看到的不是乱码,否则即使在表中的数据存储的时正确的,如果察看时没有指定正确的连接编码,则也会看到乱码,使自己产生错误的判断。尤其是在liunx下察看时,默认连接编码一般都是latin1,如果表的编码为gb2312,则就会看到乱码,所以一定要指定连接编码。
------------------
抓站中需要考虑到的问题:
1.如果一次抓取很多的页面(如:一个大型网站的所有数据(findok))需要考虑到如果中途失败,在下次应该从失败处继续抓而不是重新抓取(所以要有抓取日志)
2.考虑到抓取频率和抓取速度防止对方封ip
------------------------
mysql数据量问题
DROP TABLE IF EXISTS `spider`.`url`;
CREATE TABLE `spider`.`url` (
`id` int(11) NOT NULL auto_increment,
`purl` varchar(255) collate gb2312_bin default NULL,
`curl` varchar(255) collate gb2312_bin default NULL,
`purlcode` varchar(255) collate gb2312_bin default NULL,
`curlcode` varchar(255) collate gb2312_bin default NULL,
`ctime` datetime default NULL,
`flag` int(11) default NULL,
PRIMARY KEY (`id`)) ENGINE=MyISAM AUTO_INCREMENT=327488 DEFAULT CHARSET=gb2312 COLLATE=gb2312_bin;
当表中的数据量为5000万条左右时
根据id 进行查询花费的时间几乎可以忽略不计和数据量只有十几条时差不多,小于0.001秒 (如:id=50522653)
但是当以purlcode进行查询时花费的时间是(2 min 22.64 sec) 2分钟22.64秒(如 :purlcode=111111)