将大CSV文件显示为表格

dxxyhpgq  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(124)

我想读取一个大文件与csv数据(>1 GB,从ERP系统导出),并提供一个表接口的数据。
事实上,我有一个很好的工作表类。它以这种(抽象)方式工作:

  • 表行,它是列数据的向量
  • 行的向量。

要读取大文件,这会导致内存问题,我想是因为vector确实需要堆上的全部内存。所以我创建了一个新类,它只具有指向列中字符串的指针,如下所示:

  • 一个表行,它是列数据的vector<string *>
  • 一个vector<row>的行。

这样效果更好。它在堆上的内存占用减少了1/3。我认为分离的字符串数据适合堆上的一些洞;-)
但如果数据变得更大,内存问题也会存在。
读取文件并转换它需要大约2分钟。
我尝试了SQLLite,但是导入非常慢。阅读大文件(大约3000000行)并插入它们,需要大约15个小时。我知道我可以加快很多,但我真的不知道这是否是解决方案。顺便说一句:sqlite浏览器在导入这样的文件时崩溃!
有没有其他人有这样的问题,或者你知道一个好的方法来管理这样的大数据表的内存?表是一个查找表的一些任务,所以它应该适合内存一次,如果可能的话。
目前我正在使用Visual Studio C++ 2012。

dojqjjoe

dojqjjoe1#

在不太了解你的问题的情况下,这是我10年前遇到类似情况时会做的事情,需要36个小时才能转储到Oracle数据库中,这减少了一半以上到16个:
创建一堆缓冲区(比如10,000行数据),并让一个线程以循环方式将数据读入这些缓冲区。
然后让另一个线程开始实际处理数据。
必须承认,只有当每一行都独立于其他行时,这才有效。
Edit: This link about memory locality may help.本质上使用[]而不是vectors

qjp7pelc

qjp7pelc2#

DuckDB是一个完美的工具,它可以将数百万行CSV加载到内存表中,以在其上运行SQL查询。
这个多平台软件可以在一分钟内在一台只有32GB RAM的普通台式计算机上摄取15个CSV文件,每个文件12.6M行(总共189M)

相关问题