关于大量数据导出到 excel 或 csv 实现方案

2019-08-15 11:40:41 +08:00
 imherer

最近有个需求,需要将 PostgreSQL 里的数据导出到 excel 里(或者 csv ),可能出现的情况有 3 种:

现在问题是如果导出的数据太大的话会 OOM,如何解决呢?

现在想预估一个安全行数,在导出的行数达到安全行数后就保存这个 excel,然后再从数据库读取再追加到这个 excel 里。疑问是再次向这个文件里追加数据的时候这个文件里之前已有的数据会载到内存里来吗?

有做过的前辈分享下经验吗?

语言:go

公司内部项目,所以用户量很少,基本上就几个人使用

7714 次点击
所在节点    程序员
46 条回复
taotaodaddy
2019-08-15 11:47:45 +08:00
为什么不自己试试呢
myself659
2019-08-15 12:01:47 +08:00
有时间我可以将这个功能加上
https://github.com/myself659/csvdata
但是一般 csv 不会这么大
myself659
2019-08-15 12:03:47 +08:00
对于大大 程序分片一下就可以了
都那么大导出了一个 csv 中
不存在这种需求
反过来想一想都在一个文件里面,哪得用什么电脑才能打开 csv
wanganjun
2019-08-15 12:11:37 +08:00
pg 有导出数据到 csv 的 sql 命令,还支持重定向数据到外部程序的功能,可以实现导出到压缩文件的功能
auser
2019-08-15 12:14:41 +08:00
csv 有个 65535 限制的问题 .....

这个问题应该是 Go 的内存管理与第三方解析库的问题。数据量太大的话,要自己从“底层”实现了。

我这边处理的 xlsx 对应数据表量级在 30 万左右,几百兆的数据库文件。导出功能都是按日期筛选的,还没遇到要考虑内存的程度。

建议直接花钱加内存解决,相比解决这个问题的工钱是小钱了。如果真到了加内存都解决不了的数据量,我觉得文件使用者也没有电脑能处理这么大的 excel 文件吧。
zjj2008se
2019-08-15 12:26:18 +08:00
为什么不试试神奇的 pandas 呢?直接从数据库里面取出来存成你想要的各种格式
x2ve
2019-08-15 12:29:23 +08:00
哟哟切克闹 etl 来一套
hoyixi
2019-08-15 12:31:24 +08:00
很多数据库,本身就支持把数据备份成 csv
littlewing
2019-08-15 12:32:11 +08:00
mysql 可以直接一条 sql 导出的
话说你是 select * from table ?
imherer
2019-08-15 12:49:31 +08:00
@littlewing 嗯,因为是全字段都需要的。
liprais
2019-08-15 13:03:25 +08:00
pgdump 之后再处理呗
多读点文档没啥坏处
或者你可以用 spark 开多个 jdbc 链接做导出
encro
2019-08-15 13:46:06 +08:00
读数据,一次 10 万以内的读;
写 csv,一行一行写;
根本就不占用内存。
Kaiux
2019-08-15 14:13:41 +08:00
https://github.com/alibaba/easyexcel
阿里巴巴开源的, 虽然是 Java 做的,但是思路可以参考
我本地导出 10 万数据都是 5 秒以内, 没有 OOM
希望可以帮到你
wayne1027
2019-08-15 14:18:23 +08:00
@auser #5 csv 没有行数限制吧?哪来的 65535 ?几百年前的 xls?
maierhuang
2019-08-15 14:29:29 +08:00
copy 命令了解一下 就是不知道怎么和 go 结合
Michaelssss
2019-08-15 14:34:41 +08:00
1G 左右 CSV,excel 2016 就已经打不开了。。我不确定你说大量要多大。。。
SbloodyS
2019-08-15 14:38:51 +08:00
copy 导出 csv,Excel 一个 sheet 最多 104W,按小于等于 104W 行的数量 分片处理为多个 sheet 就好
追加数据就新开一个 sheet 来存
之前试过 1 亿行数据十几分钟就好了,很快的,不过一般 Excel 10 个左右的满 sheet 打开就慢到爆炸了
imherer
2019-08-15 14:40:02 +08:00
@maierhuang 嗯,我也搜到了这个命令,直接写成 sql 语句在程序里执行就行,还挺好用的
augustheart
2019-08-15 15:06:14 +08:00
虽然我不懂 go,但是 csv 不就是文本?按文本处理你想怎么追加都行。
maierhuang
2019-08-15 15:08:18 +08:00
@imherer 那能用 copy 就完美解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/592061

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX