日期:2014-05-17  浏览次数:20679 次

大数据处理(几千万条),求助
现在有61个文件夹,每个文件夹下面有365个txt文件,每个txt文件里面的数据格式都是固定的,大约每个文件有700行数据左右。用什么方法把这几千万条数据导入到数据库中效率会高点。。。优先要求效率...
求大牛给出思路。。。

------解决方案--------------------
for(61个文件夹){
for(365个文件){
for(700行数据){
// sql生成
preparedstatment.addBatch();
}
// 一次连接数据库执行700条数据
preparedstatment.executeBatch();
}
}
------解决方案--------------------
多线程搞不知如何?
效率没有整过
或者先把文件处理下
弄成适合数据库导入的形式
然后用数据库的命令来导入
------解决方案--------------------
嗯,我想的是将这些文件都给颗粒化保存
最小颗粒度至少是一个txt文件
转化成json或者其他结构化语言保存?
或者保存文件只是保存文件索引,然后每次请求都是根据索引请求文件内容。
这样读取效率又低了。

仅是个人想法,还请技术大牛点评
------解决方案--------------------
也许写个批处理,用Oracle自带的数据导入工具还更高效点。
------解决方案--------------------
我会用java调用外部命令(dos下oracle导入txt的命令)方式导入所有文件,循环和3楼的方法差不多(只循环文件夹和每个文件夹下的文件)
------解决方案--------------------
探讨
话说在Action里面处理多线程我还米有试过呢。。。求大蛇给意见

------解决方案--------------------
数据格式都是固定的,为什么要用程序来做这事呢?不能用数据库的功能直接导么?

另外,IO 操作用多线程等于白搭,因为 IO 操作的并发能力为 0,也就是说 IO 操作无法实现并发。
------解决方案--------------------
用 shell+sqlload
------解决方案--------------------
多线程读取组大block写入
------解决方案--------------------
是oracle的话,搜索各个文件的路径名,写ctl文件,调用oracle的load命令,速度非常快!
------解决方案--------------------
这个我干过,不过效率很低

MapReduce读取然后插入到一个MySQL表中,效率很低,关键是你的数据数目比较多,但是量不够大啊
我当时的数据是几亿条数据,

建议你用脚本调数据库load工具吧,吃不了多少内存。
------解决方案--------------------
Java code

我认为效率高点的还是格式化一下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..

------解决方案--------------------
用数据库自带的导入功能满足楼主的需求!

对于写程序来操作一张表,用多线程都不能解决这个问题,涉及数据库的DML操作只能由一个线程在操作!
------解决方案--------------------
用sqlload可以导入文件,效率比较高。不过你那个文件比较多,可以用写程序获得目录下文件,然后调用拼装成命令行调用sqlload.
------解决方案--------------------
建议:写段代码,整合61*365个txt为365个txt(占用内存比较少,如果整合为61个响应时间会比较慢),然后可以写段代码自动调用365次sqlload直接写入数据表。(每次调用时,及时清理释放资源)
另,如果需要排序调整可以再次编写程序调整。
------解决方案--------------------
python生成脚本
使用sqlldr导入