我想阅读一个包含csv-data(> 1 GB,从ERP系统导出)的大文件,并为数据提供表格界面。
事实上,我有一个很好的工作台课。这适用于这种(抽象)方式:
要读取大文件这会导致内存问题,我认为因为向量确实需要在堆上立即使用整个内存。所以我创建了一个新类,其中只有指向列中字符串的指针,如下所示:
vector<string *>
vector<row>
。效果更好。它在堆上的内存占用量减少了约1/3。我认为分离的字符串数据适合堆上的某些漏洞; - )
但是如果数据变大,那么内存问题也存在。
要阅读文件并将其转换大约需要2分钟。
我尝试过SQLLite,但导入速度非常慢。读取大文件(大约3000000行)并插入它们大约需要15个小时。我知道我可以加速这个,但我真的不知道这是否是解决方案。 BTW:sqlite浏览器在导入这样的文件时崩溃了!
其他人是否有这样的问题,或者您是否知道管理此类BIG数据表的内存的好方法?该表是某些任务的查找表,因此如果可能,它应该立即适合内存。
目前我正在使用Visual Studio C ++ 2012。
答案 0 :(得分:0)
在不了解你的问题的情况下,这就是我10年前遇到类似情况时会做的事情,并且需要36个小时才能转入Oracle数据库,这个数字减少了一半到16:
创建一堆缓冲区(比如10,000行数据),并以循环方式将数据读入这些缓冲区。
然后让另一个线程开始实际处理数据。
不可否认,这只有在每行独立于其他行时才有效。
Edit: This link about memory locality may help.基本上使用[]
代替vectors
。