一个面试题

一篇帖子的总结

---------------------------------------------------------------------------------------------------------------------------------------------------

我前几 天到一家软件公司去应聘,那个项目经理就出了一道题(2个小时做完):开发工具随便你选,20分钟内通过读取TXT文本文件向数据库一表内插入6千万条数据(该表有8       个字段)。我知道他是考数据算法问题,不知道这个算不算BT!!!请教高手指教!!!!  

---------------------------------------------------------------------------------------------------------------------------------------------------

 这个和几个字段没有太大关系。如果一条记录1k,6000w至少需要60G,20分钟是无论如何也不可能写完的。如果1条记录满8k,就是480G,创建文件也要一定时间的

---------------------------------------------------------------------------------------------------------------------------------------------------

 

[test.txt]  
colnameheader=true  
format=Delimited(@)  
col1       =       "tb1"       text                                                                                      
col2       =       "tb2"       text                                                                                                  
col3       =       "tb3"       text                                                                                                                  
col4       =       "tb4"       text                                                                          
col5       =       "tb5"       text                                                                          
col6       =       "tb6"       text          

然后调用  
SET       @strSQL       =  
                                    '      
    INSERT       INTO       temptable  
    SELECT       *       FROM  
    OPENROWSET(''MSDASQL'',''Driver={Microsoft       Text       Driver       (*.txt;       *.csv)};DEFAULTDIR='+@Filepath+';Extensions=CSV;'',  
    ''SELECT       *       FROM       [test.txt]'')'  

Exec       (@strSQL)                      
Filepath是文件路径,如果服务器配置够好的话,应该用这个方法不成问题,你试试!

--------------------------------------------------------------------------------------------------------------------------------------------------

这个问题。。。。


我觉得这个算法本身没有什么难度吧,插入一条数据的时间是固定的,读取一个文件的时间也是固定的,插入算法也是固定的非常简单,读出来插进去,都是一个O(N)的时间复杂度。读取文件的IO操作可能是主要的性能瓶颈,你可以考虑起多线程来实现。

我的想法是:
1、这种大的文件不适合一次读入内存,所以必须使用流读取。
2、读取N行将其放入缓冲池中(实际上应该是一个对象,可能有N个缓冲池),当一个缓冲池满了则开始启动一个线程将该缓冲池中的数据写入数据库,直到这个缓冲池空了为止。
3、当一个缓冲池空了,则可以继续接收新的数据,直到所有数据都读取完毕。 

--------------------------------------------------------------------------------------------------------------------------------------------------

20分钟内6千万条数据?按8个16bit   int字段算...纯数据就7G多...处理速度要达到10M/s以上...

这已经不单纯是程序问题了...涉及整个系统能力...这个职位是DBA吗?

--------------------------------------------------------------------------------------------------------------------------------------------------

用C/C++写估计还是可以达到要求的。
如果用ODBC的SQLBulkOperations,字段不多的情况下,1秒钟插入10万条数据还是可以的。
6000w大约需要10分钟。加上解析文本文件的时间,20分钟应该够用了。
(注:上面没考虑扩充数据库磁盘文件大小的开销,如果已提前在磁盘上分配了足够大小的空间,20分钟还是有可能的)

--------------------------------------------------------------------------------------------------------------------------------------------------

如果是orcale直接写   sql   plus   吧,先把数据流拆分,6000万不是个小数目,应该拆分成若干块,这还要看servier的内存实际吞吐率,完了将数据分组提交,应该快一些。

--------------------------------------------------------------------------------------------------------------------------------------------------

这个问题并不复杂,也不麻烦也没有考多少东西,仅仅是考你知道不知道SqlServer里面有个bcp命令.

BULK   INSERT   命令和导入导出向导   也提供不了这么高的速度,只有专门为海量数据准备的bcp命令可以做到

请看帮助里面的bcp命令的说明,这个命令可用于把文本导入数据库,也可反过来.

网上我看到过的bcp最快插入速度是每秒200万行,而我以前在移动公司处理月清单数据时平均稳定在每秒40万行左右,月清单表为18个字段,总长度120个字符.换用bcp方式以前用批插入处理,导入过程需要58小时,但是用bcp以后全过程只要5分钟.


任何自己写循环或Sql语句的方式都达不到这个速度.

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值