首页 新闻 会员 周边 捐助

如何把一个文本文件中的十几万数据快速的导入到sql表中

0
悬赏园豆:10 [已解决问题] 解决于 2014-04-28 11:41

如题,我想快速的导入,如果用读取每行一行行导入的话,真的很慢,谁能告诉我个快速的方法,每行的格式都是一样的

ychyx的主页 ychyx | 初学一级 | 园豆:189
提问于:2012-07-30 15:56
< >
分享
最佳答案
0

“读取每行一行行导入”并不是慢的原因,因为任何解决方案最后都是如此。区别在于,你如何分配CPU和IO来处理这个流程。

因此,你需要先摸清你的需求,文本文件中每行记录的长度固定吗?每行都是以换行符结束吗?有需要将数据类型转换的列吗?需要类型检查吗?如果需要的话,有多严格?数据插入需要检查吗?是否要处理插入失败的场景?

收获园豆:5
Launcher | 高人七级 |园豆:45050 | 2012-07-30 16:08

一些需求并不严格,因为数据的类型就是表中字段的,能不能详细说下应该怎么插入!

ychyx | 园豆:189 (初学一级) | 2012-07-31 09:00

@ychyx: 我提到的类型转换是这个含义,你在txt中存放了一个表示数字:2034.12的字符串,很遗憾的是,数据库中对应字段的数据类型是浮点,那么在你的程序里你需要先读出字符串“2034.12”,然后再转换成浮点类型存入数据库。一般的情况下,这种应用都遵循如下流程:

1,从输入流读取一定大小的数据;

2,将读入的数据解析成标准格式;

3,插入数据库;

4,回到 1;

利用并行运算的优势,1,2,3可以并行执行,合理的分配为每一个阶段分配的线程数,可以找到一个最优的组合以发挥硬件的最大性能。其中每一个阶段又可以单独的优化,比如在1中,可以根据数据特点来制定如何读取数据,已经每次读取数据的大小;在2中,根据数据特点,采用最佳的标准化方式;在3中,可以采用SqlBulkCopy来简单的提高插入速度,当然批量插入多大,应该通过实际测试来调整,同时也要调整传输大小来适配。

代码的优化是无止尽,涉及到I/O操作时,尽可能的利用并行和IOCP可以提高CPU的利用率,让CPU把更多的精力的放在数据标准化上。

Launcher | 园豆:45050 (高人七级) | 2012-07-31 09:40
其他回答(7)
0

DTS,直接选择导入数据就行。很快的。当年csdn的密码就是这么导入的。其他的方法不太容易。

迷路中的路人甲 | 园豆:93 (初学一级) | 2012-07-30 16:06

问题是我得需要在程序中插入

支持(0) 反对(0) ychyx | 园豆:189 (初学一级) | 2012-07-31 09:01
0

sql server中有导入数据的功能的。

chenping2008 | 园豆:9836 (大侠五级) | 2012-07-30 16:07

我是需要用代码插入,c#

支持(0) 反对(0) ychyx | 园豆:189 (初学一级) | 2012-07-31 09:01

@ychyx: 用NPOI(excel 03) 或者是 EPPLUS(excel 07) 读取excel的内容,然后用多线程的方式插入这些读取到数据到数据库中。 数据的读取一次可以读取几万条,然后插入,下次再来读取剩下的几万条数据,这个可以做个定时的windows服务。 excel有行的限制,最多是 65535条吧。我先如果几万的数据读取影响到内存。可以几千条一读取。

支持(1) 反对(0) chenping2008 | 园豆:9836 (大侠五级) | 2012-07-31 09:39
0

读到内存,直接插

收获园豆:5
風吹云动 | 园豆:69 (初学一级) | 2012-07-30 17:21

读到内存的话,由于我的数据量太大,在执行的过程中,当插入几万条数据的时候就会说内存溢出!!

支持(0) 反对(0) ychyx | 园豆:189 (初学一级) | 2012-07-31 08:59

@ychyx: 我做3千万条数据处理时候使用用DataRead,数据量大的话,3分钟搞定不过是SQL SEVER中,文本文件,要么你就分割一下,放到内存Table里面进行处理,一般4G内存的话,100多万条数据不是问题,不过我也不懂具体你一条数据占用多少字节,其他目前没有尝试过。

支持(0) 反对(0) 風吹云动 | 园豆:69 (初学一级) | 2012-07-31 15:50
0
Dino H.Y | 园豆:151 (初学一级) | 2012-07-30 19:06
0
Zjmainstay | 园豆:355 (菜鸟二级) | 2012-07-31 09:38
0

如果写程序的话,你看一下BULKCOPY的例子,可以先程序内把文本读取插入到datatable,再用bulkcopy类的方法插入表。

汗血宝鸭 | 园豆:229 (菜鸟二级) | 2012-08-03 13:10
0

你可以参考我写的一篇博客:

某社区600万用户数据导入MYSQL、MSSQL、Oracle数据库方法

我要将 username # password # email这样的格式导入到sql server中去,一共有600万行。使用bulk insert。

xwdreamer | 园豆:144 (初学一级) | 2012-08-06 13:33
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册