大数据处理(几千万条),求助

懒得搭理你 2012-02-13 09:55:24
现在有61个文件夹,每个文件夹下面有365个txt文件,每个txt文件里面的数据格式都是固定的,大约每个文件有700行数据左右。用什么方法把这几千万条数据导入到数据库中效率会高点。。。优先要求效率...
求大牛给出思路。。。
...全文
1725 54 打赏 收藏 转发到动态 举报
写回复
用AI写文章
54 条回复
切换为时间正序
请发表友善的回复…
发表回复
hellofreeman 2012-02-18
  • 打赏
  • 举报
回复
sql server里面可以用 bulk insert
  • 打赏
  • 举报
回复
多线程搞不知如何?
效率没有整过
或者先把文件处理下
弄成适合数据库导入的形式
然后用数据库的命令来导入
major78517 2012-02-17
  • 打赏
  • 举报
回复
python生成脚本
使用sqlldr导入
czmchen 2012-02-16
  • 打赏
  • 举报
回复
用数据库自带的导入功能满足楼主的需求!

对于写程序来操作一张表,用多线程都不能解决这个问题,涉及数据库的DML操作只能由一个线程在操作!
eros0405 2012-02-16
  • 打赏
  • 举报
回复
shell + load infile
星火燎猿 2012-02-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 flagiris 的回复:]

for(61个文件夹){
for(365个文件){
for(700行数据){
// sql生成
preparedstatment.addBatch();
}
// 一次连接数据库执行700条数据
preparedstatment.executeBatch();
……
[/Quote]可以试试这个
petersteven 2012-02-16
  • 打赏
  • 举报
回复
建议:写段代码,整合61*365个txt为365个txt(占用内存比较少,如果整合为61个响应时间会比较慢),然后可以写段代码自动调用365次sqlload直接写入数据表。(每次调用时,及时清理释放资源)
另,如果需要排序调整可以再次编写程序调整。
lincy0000 2012-02-16
  • 打赏
  • 举报
回复
用sqlload可以导入文件,效率比较高。不过你那个文件比较多,可以用写程序获得目录下文件,然后调用拼装成命令行调用sqlload.
unbelievable2010 2012-02-16
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 xxrlily 的回复:]
用 shell+sqlload
[/Quote]


正解
Benz_lim 2012-02-16
  • 打赏
  • 举报
回复
用sqllrd,大概4秒钟就能导进去了。
kouyiSC 2012-02-15
  • 打赏
  • 举报
回复

我认为效率高点的还是格式化一下txt中的数据。。直接将txt的数据通过oracle命令映射插入表。。。

你那么多文件。。数据量那么大。。在应用中,无论怎么优化。。都没有直接使用命令行效率高。。直接和oracle性能挂钩。。少一个环节。。。

具体做法:例子:

1. 创建测试表
create table test_import
(
id int primary key,
name varchar2(50),
age int,
test_null varchar2(20),
remark varchar2(100)
);

2. 创建imTable.ctl文件
load data infile 'f:/test.txt' append into table test_import
trailing nullcols
(
id terminated by ',', --字段
name terminated by ',', --字段
age terminated by ',', --字段
remark terminated by ',' --字段
);

3. 创建test.txt文件
test.txt
1,t1,20,第一个测试
2,t2,25,第二个测试
3,t3,22,第三个测试
4,t4,30,第四个测试
5,t5,28,第五个测试
6,t6,23,第六个测试

4. sqlplus中sql导入语句
sqlldr 用户/密码@数据库实例名 control='f:/imTable.ctl' log='f:/log.txt' bad='f:/bad.txt'

5. 完成。。查看日志log.txt..


xuhaipeng 2012-02-15
  • 打赏
  • 举报
回复
27楼正解。
xiaozhangnima 2012-02-15
  • 打赏
  • 举报
回复
标记了,呵呵,sqllqr
懒得搭理你 2012-02-15
  • 打赏
  • 举报
回复
明白了,主键可以使用序列,指定某一列不在.csv数据文件中。
可是有几千个文件,我不可能这样写:
infile a.csv
infile b.csv
...
...
...
有米有更简单点的方法
懒得搭理你 2012-02-15
  • 打赏
  • 举报
回复
对oracle不大了解 还望楼上的高手指导:sqlloader如何导入多个文件和如何解决主键问题
MiceRice 2012-02-15
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 wangyinbin 的回复:]
txt中给的数据都没有主键,所以打算先用程序处理下,将txt文件加上一列主键,
然后用下楼上的方法。不知道这样速度是不是快一点。
直接用程序导入数据库的确很慢,一千多万条数据大概得花5个小时,所以还是打算放弃这种方法。
[/Quote]

很好奇为啥不写个批处理,用数据库自带的数据导入工具,能给个理由么?没有主键并不算是理由吧?
懒得搭理你 2012-02-15
  • 打赏
  • 举报
回复
txt中给的数据都没有主键,所以打算先用程序处理下,将txt文件加上一列主键,
然后用下楼上的方法。不知道这样速度是不是快一点。
直接用程序导入数据库的确很慢,一千多万条数据大概得花5个小时,所以还是打算放弃这种方法。
济南大飞哥 2012-02-14
  • 打赏
  • 举报
回复
既然不考虑方法,只是导入,就 sqlload 吧
ylovep 2012-02-14
  • 打赏
  • 举报
回复
批处理 osql
furtherliu 2012-02-14
  • 打赏
  • 举报
回复
27楼正解。
加载更多回复(30)

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧