5 08年5月

mysql load data infile

关键字:,

如何提高mysql load data infile的速度
测试数据2.5G,共有数据9427567条。用的mysql的large服务器的配置。
load一次需要大概10分钟左右。
建的表用的是MYISAM,调整了几个session的参数值

SET SESSION BULK_INSERT_BUFFER_SIZE=256217728;
SET SESSION MYISAM_SORT_BUFFER_SIZE=256217728;

运行结果如下

Query OK, 9427567 rows affected, 1558 warnings (3 min 55.21 sec)
Records: 9427567 Deleted: 0 Skipped: 0 Warnings: 0
google到的还可以

set global KEY_BUFFER_SIZE=256217728;
alter table tablename disable keys;

如何load数据里面带反斜杠(backslash)”\” 的数据
由于如果你没有指定FIELDS子句,则默认值为假设您写下如下语句时的值:
FIELDS TERMINATED BY ‘\t’ ENCLOSED BY ” ESCAPED BY ‘\\’
所以,如果你的数据里面有反斜杠(backslash)”\”的时候,数据会出现被截断的问题。出现这种问题,只要写上如下的fields子句即可
FIELDS TERMINATED BY ‘\t’ ENCLOSED BY ” ESCAPED BY ”

如何load不同编码的数据
原来用的4.X的mysql,我是select INTO OUTFILE ,只后用iconv,或者其他软件来做。可以参考这里,但是由于这次数据大,用ultraedit等软件打开都要半天。好在新版的mysql可以增加一个新的参数
CHARACTER SET gbk
我的文本数据是GBK的编码,数据表是utf8的,用这种方法测试成功。
如何load的时候只insert特定的列
比如表里面有比元数据多的列。可以在load的时候指定要插入的字段名字。

示例的代码如下:

LOAD DATA INFILE '~/data.txt'   
INTO TABLE fb0505   
CHARACTER SET  gbk   
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY ''
LINES TERMINATED BY '\n' STARTING BY '' 
(seller_id,fb_type,fb_date,item_url);

其中表fb0505里面还有一列是id。

贝贝爸 发表在 原创技术文章 | 等您写评论

24 08年4月

python读有文件结束符的txt文本文件

关键字:,

一直用python读文件都是文本文件。用的方法是:

lines=open('ft.txt')

但是前两天读一个几百兆的大文件的时候,遇到了奇怪的问题,觉得是内容没有读完。定位最后读到的行,用emeditor打开,发现有一个怪字符“”。编码是“\x001a”,一查,原来是文件结束符号。
一直郁闷,奇怪为啥文本文件里面有文件结束符,试了好多办法,都不行,最后经limodou指点,原来这种情况要当成二进制文件来读。

lines=open('ft.txt','rb')

文件内容如下:

abcdefg

两种不同情况的结果如下:

>>> f=open('ft.txt')
>>>
f.read()
'abc'
>>>
f=open('ft.txt','rb')
>>>
f.read()
'abc\x1adefg'

贝贝爸 发表在 原创技术文章 | 等您写评论

22 08年4月

jquery货币数值排序


jquery是个好东西,现在有很多基于它的plugin,tablesorter 就是一个。
上面有好多例子,就不转贴了。最近做了一个小东西,用到了它。
因为是财务的东西,金额用到了千分位,就是每多三位,加一个逗号。原来用都是按照数字来的,加了这个逗号之后,tablesorter不认为它是数字了,他认为234.00比1,234.53大。这也难怪,看了例子,如果是这种货币格式,前面如果是$符号的话,这种格式排序是没问题的。
仔细看了一下文档,原来人家已经考虑到了这样的问题,加下面代码就可以了。

$("#myTable").tablesorter({
    
headers: { 4: {sorter:"currency"}}
});

测试通过

另:推荐一篇关于中国教育讨论的文章

贝贝爸 发表在 原创技术文章 | 等您写评论

15 08年2月

javascript怪异的access is denied

关键字:,

要实现这样一个功能,一个活动很多人报名,后台做操作界面,可以给某些数据做一下标记。
本地开发,本地的环境+测试数据测试通过,到了线上,就死活不行。
因为表单有简单的校验,用了javascript的document.submit()。总是报错,说 access is denied
原来怀疑是因为提交的按钮在浮动层的原因,后来发现数据量大了就不行,因为每条数据会有checkbox。
网上google了半天,也没有对症的解决方法,大多是安全因素造成的。在冥思苦想没有结果,正一筹莫展的时候。突然想起了GET提交的数据长度是有2048个字节的限制的。
然后查看了代码,原来从别的地方复制过来的form表单,用的是get方法,改成method=”post”后,问题解决。

车到山前啊。

贝贝爸 发表在 原创技术文章 | 等您写评论

18 07年12月

为google toolbar添加https的gmail button

关键字:

google的toolbar是我浏览器装的唯一一个工具条,gmail是我现在使用的主力邮箱,google toolbar的功能就不介绍了,它和google的其它产品结合的比较好。
google toolbar可以添加Custom Button,比如你经常在A网站搜索,可以在搜索框的地方点右键,菜单最下面会有一个“Generate Custom Search…”,按照提示走,可以在你的工具条上增加一个按钮,如果A网站设置了favorite icon的话,按钮就是这个icon。你可以在工具条搜索的地方输入要搜索的内容,点击自己增加的那个button,那么会调用A网站的搜索程序来进行搜索。
可以用本站右上角的搜索框测试一下,一定要先装google的toolbar哦。
gmail也可以增加到toolbar上,但是有一个问题,就是,增加后是http连接的,但是有时候可能会因为网络或其他原因,http不能用,每次都要去修改为https的连接。
找到2个方法
方法一
用https://www.gmail.com/打开gmail,在左边的 Invite a friend –>Give Gmail to: 输入框里点邮件,生成一个custom的search,优点是简单,方便,缺点是,不能搜索,只是加了一个链接而已。
方法二
首先按正常方法增加一个gmail button,然后要改一下配置文件,开始–>运行,输入

%USERPROFILE%\Local Settings\Application Data\Google\Custom Buttons

会有几个xml文件,我这里是一个
toolbar.google.com_J66T77NJDBMW4FEUU7FA.xml
打开,搜索
http://mail.google.com
替换为
https://mail.google.com,应该有三个位置。
保存后,重新开浏览器,发现搜索和直接点击都已经是https的连接。

更多google api的信息 http://www.google.com/tools/toolbar/buttons/apis/

贝贝爸 发表在 原创技术文章 | 等您写评论

13 07年12月

Groovlets (groovy servlet) 的 helloword

关键字:,

需要
Groovy Version: 1.5.0
resin pro 3.1.4
groovy的安装,略

启动resin后,会有一个%RESIN_HOME%\webapps\ROOT\WEB-INF\web.xml文件。
增加如下内容

<servlet>
      
<servlet-name>GroovyServlet</servlet-name>
      
<servlet-class>groovy.servlet.GroovyServlet</servlet-class>
    
</servlet>
    
<servlet>
        
<servlet-name>GroovyTemplate</servlet-name>
        
<servlet-class>groovy.servlet.TemplateServlet</servlet-class>   
    
</servlet>
    
<servlet-mapping>
        
<servlet-name>GroovyServlet</servlet-name>
        
<url-pattern>*.groovy</url-pattern>
    
</servlet-mapping>
    
<servlet-mapping>
        
<servlet-name>GroovyTemplate</servlet-name>
        
<url-pattern>*.gsp</url-pattern>
    
</servlet-mapping>

copy %GROOVY_HOME%\lib\下的
groovy-1.5.0.jar
asm-2.2.jar
antlr-2.7.6.jar

%RESIN_HOME%\lib
启动resin,在
%RESIN_HOME%\webapps\ROOT下新建2个文件
hello.gsp
————-

<%
def h="hello"
def w="world"
println "$h $w"
print 2+2
println " times"
 %>

hello.groovy
——-

println """
<html>
    <head>
        <title>Groovy Servlet</title>
    </head>
    <body>
Hello world @ ${new Date()}
    </body>
</html>
"""

运行后
http://localhost:8080/1.gsp
http://localhost:8080/a.groovy
的内容分别为
hello world 4 times
Hello world @ Thu Dec 13 23:04:18 CST 2007

贝贝爸 发表在 原创技术文章 | 1个评论

6 07年12月

注意.js文件的编码

关键字:,

在调试javascript代码的时候在a.html引用了b.js这个文件。
原来测试都没有问题,但是paste了一些原来的老代码后,ie出现js报错,但是firefox不抱错。
报错的信息如下:
return statement outside of functions
狗了半天,说是retrun写的位置不对,但是新写的代码和老的代码都没问题啊,一直在用。没办法,只能一段段的删除
期间还报过下面的错误
XXX is not defined
XXX是一个函数里面传过来的变量。函数都没用,居然也抱错。狠奇怪。
最后只剩2个function了,中间有一段代码的注释,是中文的。我把注释删掉,好了!

突然想起来问题所在了,原来是编码问题。上面的a.html是utf-8编码,而js里面的中文是gbk的编码,由于a.html是全英文的,所以没注意编码。而老的代码一直都是在gbk或者gb2312编码的页面上用,所以一直也没问题。

最后修改a.html为gbk的编码,问题解决。
比较好的习惯可能应该是公用的js代码里面不要用中文的注释。。

贝贝爸 发表在 原创技术文章, 日记图片 | 等您写评论

18 07年10月

oracle null值的排序

关键字:,

原来写过一个程序,需要按照数据的更新日期的倒叙来排序来排序。oracle好像是把null当作最大的值,测试了varchar2和number也是这样认为的。

阅读全部»

贝贝爸 发表在 原创技术文章 | 等您写评论

27 07年9月

jquery选择例子3

关键字:

选取一个name为”S_03_22″的input text框的上一个td的text值
$(”input[@name=S_03_22]”).parent().prev().text()

名字以”S_”开始,并且不是以”_R”结尾的
$(”input[@name^=’S_’]”).not(”[@name$=’_R’]”)

一个名为radio_01的radio所选的值
$(”input[@name=radio_01][@checked]”).val();

贝贝爸 发表在 原创技术文章 | 等您写评论

21 07年8月

删除表中重复数据的sql

关键字:,

一张多用户的通讯记录表,主要是手机信息,每个用户可以建立自己的联系人组。
原来数据对数据没有校验,用户可以在一个组里面输入重复手机号码,如果数据量大,会造成数据重复。
所以要做一个唯一性的索引,如下:

create unique index inx_uniq_cellphone_onegroup on addresslist (cellphone, groupid, operatorid);

目的是保证每个用户的每个组里面,不能有同样的cellphone。
但是建立的时候出错,因为里面原来有重复的数据。
清除重复的数据,用如下的sql,如果重复的就删除rowid不等于max(rowid)的那条记录。

delete addresslist
 
where rowid not in (select rowid1
                      
from addresslist a,
                            
(select cellphone,
                                    
groupid,
                                    
operatorid,
                                    
max(rowid) rowid1,
                                    
count(*)
                              
from addresslist
                              
group by cellphone, groupid, operatorid) b
                      
where a.cellphone = b.cellphone
                        
and a.groupid = b.groupid
                        
and a.operatorid = b.operatorid
                        
and a.rowid = b.rowid1)

贝贝爸 发表在 原创技术文章 | 1个评论