我有几个(1-5)非常宽(~50,000列).csv文件。文件大小为(.5GB-1GB)(平均大小约为500MB)。我需要在预先指定的列上对文件执行连接。当然,效率是关键。可以扩展以有效地允许多个连接列的任何解决方案都是奖励,但目前不需要。以下是我的意见:
-Primary File
- 次要文件
- 主文件的加密列(名称或列号位置)
- 辅助文件的加入列(名称或列号位置)
-Left Join或Inner Join?
输出= 1包含多文件连接结果的文件
我希望使用基于C语言解决问题,但当然算法解决方案也会非常有用。
答案 0 :(得分:3)
假设您有充分的理由不使用数据库(据我所知,50,000列可能构成这样的原因),您可能别无选择,只能咬紧牙关并为自己建立正确文件的索引。按顺序读取它以填充哈希表,其中每个条目仅包含键列和文件中整个行开始的偏移量。然后索引本身应该适合内存,如果你有足够的地址空间(即除非你坚持使用32位寻址),你应该对实际文件数据进行内存映射,这样你就可以访问并输出适当的右边行顺便走过左文件时很容易。
答案 1 :(得分:2)
到目前为止你最好的选择就是像Sqlite一样,它有C ++绑定,它是为快速插入和查询提供量身定制的。
对于数据的实际读取,你可以一行一行地插入Sqlite中的字段,不需要破坏对象的缓存对象:)作为优化,你应该在一个语句中组合多个插入( insert into table(...) select ... union all select ... union all select ...
)。
答案 2 :(得分:1)
如果需要使用C或C ++,请打开文件并将文件直接加载到MySQL等数据库中。 C和C ++语言没有足够的数据表结构,也没有操作数据的功能。电子表格应用程序可能很有用,但可能无法处理容量。
也就是说,我推荐每个字段(列)的对象。将记录(特定于文件)定义为字段集合。从文件中读取文本行为字符串。让记录从字符串加载字段数据。将记录存储到vector
。
为目标文件创建新记录。对于输入文件中的每条记录,使用这些字段加载新记录。最后,对于每条记录,使用分隔字符打印每个字段的内容。
另一种方法是打造一个2维的字符串矩阵。
您的性能瓶颈将是I / O.您可能希望读取大量数据。效率的刺是CSV文件的可变记录长度。
我仍然建议使用数据库。那里有很多免费的,比如MySQl。
答案 3 :(得分:0)
这取决于你所说的“加入”。文件1中的列是否与文件2中的列相同?如果是这样,您只需要合并排序。很可能基于合并排序的解决方案是“最好的”。但我同意上面的@Blindy你应该使用像Sqlite这样的现有工具。对于列列表的更改,这样的解决方案可能是未来的证据。