面试题,头大不知道该怎么办。 热:报错 -问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

面试题,头大不知道该怎么办。 热:报错

kun坤 2020-06-07 13:34:31 33

    技术面试的时候,他问我,excel里有百万条数据,如何写入到数据库呢?  这里考的是性能上的问题。  

    个人回答不上来,甚至不知道怎么回答,就对他说  只要在不影响性能的前提下分批读取分批插入,  问我怎么设计,我直接蒙了。  这样的题目我应该怎么回答????请教给位大神。

 

不使用框架。

数据库
分享到
取消 提交回答
全部回答(1)
  • kun坤
    2020-06-08 11:17:45

    直接把两种文件格式改咯。。。。对文件直接做格式转换。这是最快的方式了。 读个毛,写个毛,直接用C,把excel的文件读到内存。按照数据库表的规则,直接对数据库的已有表文件操作。如果格式没有问题,整块的塞。

    别说我SB,这是专业做法。也就是所谓的转码器的工作。

    ######这位同学估计是在说类似access,dbf这种小型数据库吧,可以直接按他的文件格式写,一般这种东西普通人都想到怎么往大型数据库里面导入######膜拜,还能这么搞######直接用C,把excel的文件读到内存。按照数据库表的规则,直接对数据库的已有表文件操作. 我居然没读懂这句话。。。######还有这样的做法,太神了。完全没想到。。。。牛人啊######批量插入: com.jfinal.plugin.activerecord.Db.batch(......)######应该是想要将Excel当数据源select * into ……这样的答案吧。###### @Secret : 看你头像估计是JAVA的,做应用开发的,自然爽。我们做C的,整天就没白天黑夜的在底层折腾这种事情。你们如同豪华油轮上的侍者,虽然服务于民,但多少一样可以看到风景。我们是锅炉房里铲煤的,自然你们不知道昏天黑地里,还有一片火光。。。哈。
    ######回复 @布谷鸟 : 桑那用工资??太亏了吧。银行的钱不借,傻哦。。哈。######嗯,你们领工资去桑拿按*摩的时候,我们忙着到银行还信用卡-_-//######

    是java吗?

    我只用过jxl.jar包从excel导入数据库,三五万条没问题,太大量的也没有试过。

    我是这么做的,先从excel读取一定的数量,比如说100条,批量插入数据库,甚至可以适当的sleep一下释放掉数据库服务器资源,如此往复。

    百万条excel数据用jxl不知道会不会报内存溢出,但是可以在运行程序之前,加大jvm内存,应该是可行的。

    ######

    又是小倩风格. 

    execl文件是啥格式? 好吧, 这个也还可以有资料可以参考 , 毕竟有可以兼容execl的开源软件可以参考. 

    那数据库表文件呢, 去哪里可以看到oracle的数据文件是啥格式?哪里有这样的资料?


    ######

    引用来自“中山野鬼”的答案

    直接把两种文件格式改咯。。。。对文件直接做格式转换。这是最快的方式了。 读个毛,写个毛,直接用C,把excel的文件读到内存。按照数据库表的规则,直接对数据库的已有表文件操作。如果格式没有问题,整块的塞。

    别说我SB,这是专业做法。也就是所谓的转码器的工作。

    用 win 的Com 接口, 直接调用 excel的接口, 导出csv

    然后 想咋干就咋干

    软件就是服务嘛

    把Excel 当成工人看待

    ######

    引用来自“布谷鸟”的答案

    是java吗?

    我只用过jxl.jar包从excel导入数据库,三五万条没问题,太大量的也没有试过。

    我是这么做的,先从excel读取一定的数量,比如说100条,批量插入数据库,甚至可以适当的sleep一下释放掉数据库服务器资源,如此往复。

    百万条excel数据用jxl不知道会不会报内存溢出,但是可以在运行程序之前,加大jvm内存,应该是可行的。

    jxl是一个java用于处理小数据量的,而且易于使用的处理excel的类库,但仅限于数据量比较少。因为jxl是将workbook中的整个sheet的内容都加载到内存中来处理的,如果你操作的是getSheets(),那么将把workbook中所有的sheet都加载到内存,然后才处理。所以针对数据量比较大的情况下,还是不要使用jxl。另外他对03之前的支持还可以,之后就不支持了。对于数据量比较小的情况下,可以玩玩,数据量大的情况下可以尝试使用poi.
    ######

    引用来自“justin_cn”的答案

    引用来自“布谷鸟”的答案

    是java吗?

    我只用过jxl.jar包从excel导入数据库,三五万条没问题,太大量的也没有试过。

    我是这么做的,先从excel读取一定的数量,比如说100条,批量插入数据库,甚至可以适当的sleep一下释放掉数据库服务器资源,如此往复。

    百万条excel数据用jxl不知道会不会报内存溢出,但是可以在运行程序之前,加大jvm内存,应该是可行的。

    jxl是一个java用于处理小数据量的,而且易于使用的处理excel的类库,但仅限于数据量比较少。因为jxl是将workbook中的整个sheet的内容都加载到内存中来处理的,如果你操作的是getSheets(),那么将把workbook中所有的sheet都加载到内存,然后才处理。所以针对数据量比较大的情况下,还是不要使用jxl。另外他对03之前的支持还可以,之后就不支持了。对于数据量比较小的情况下,可以玩玩,数据量大的情况下可以尝试使用poi.

    From http://www.andykhan.com/jexcelapi/tutorial.html

    Memory Allocation and Sheet Caching

    For very large files, it was found that reading in the entire workbook led to horrendous performance. As of version 1.6, it was therefore decided to read in a sheet at a time. Every call to getSheet() frees up all the objects currently allocated in the current sheet and then reads in all the data from the next sheet. This alleviated the problems which previously occurred, but it does however assume that the giant size workbooks are spread over several sheets - if not, performance problems and OutOfMemoryExceptions may still occur. 

    A consequence of this is that if you are using the API to constantly flick between sheets in a large workbook, then this will result in adverse performance because every call to getSheet is causing ExcelRead to re-read and re-deduce all the data. It is recommended that ,if possible, the client application should do all their processing necessary on one sheet before progressing to the next. 

    The method getSheets(), which returns an array of all sheets, will still attempt to hold all sheets in memory at the same time. Use of this method for very large spreadsheets is not recommended. 
    ######直接 copy to啊 load进去啊 转换导入的格式,很快的。 跟 @中山野鬼 那速度差不多。
    0 0
数据库
使用钉钉扫一扫加入圈子
+ 订阅

分享数据库前沿,解构实战干货,推动数据库技术变革

推荐文章
相似问题