【发布时间】:2015-02-20 03:51:39
【问题描述】:
我正在尝试找出一些处理大型数据文件的最佳方法。我有一个场景,我将有几个 CSV 文件,我希望能够查询数据。我将逐行读取其中一个 csv 文件,但我需要能够根据我当前正在读取的行中的键查询第二个 CSV 文件。我不想(至少我不认为)将整个 CSV 加载到内存对象中,因为它们可能是数百万行并且会占用大量 RAM。我考虑过将它们即时写入某种数据库文件,但这似乎并不有效,因为您实际上是在复制数据。有什么建议吗?
【问题讨论】:
-
在不同线程上以25%的块逐行打开需要读取的部分
-
也许您可以考虑运行一个后台服务来将您的 CSV 文件移动到数据库。然后就可以轻松进行 SQL 查询了
-
要求不明确,也许你只需要第一个CSV的一行来做查询,如果是这样的话,
StreamReader.ReadLine()就足够了。如果您确实需要 100 万行中的所有键来执行查询,那么您没有更好的选择。 -
是什么让您认为将数据复制到数据库中效率低下?数据库不仅仅是一种存储机制。它也有索引……这是一种常见的优化,将数据复制成易于阅读的形式……哎呀,我们甚至在现实生活中通过书籍和互联网来做到这一点……
-
除非您正在执行随机查询的 CSV 文件真的很大,否则我建议将其保存在存储中。 KISS 原则。作为替代方案,如何读取它并记下文件中的键和偏移量,以便在需要时读取各个行。