2

如果我有一个 CSV 文件,将文件保存为位置文本或将其转换为其他格式会更快吗?(用于搜索)

在搜索 CSV 文件方面,检索特定行(按键)的最快方法是什么?不是指对文件进行排序抱歉,我的意思是在文件中查找任意键。

一些更新:

  1. 该文件将是只读的
  2. 该文件可以被读取并保存在内存中
4

4 回答 4

2

有几件事情需要考虑:

  • 你存储什么样的数据?将其转换为二进制格式真的有意义吗?二进制格式会占用更少的空间(读取文件所需的时间取决于大小)吗?

  • 您是否在系统运行时对同一个文件有多个查询,或者您是否必须在每次有人查询时加载文件?

  • 您需要在不同系统之间高效传输文件吗?

所有这些因素对于决策都非常重要。常见的情况是您只需要加载一次文件,然后执行多次查询。在这种情况下,存储数据的格式并不重要,因为无论如何它都会存储在内存中。花更多时间思考处理查询的良好数据结构。

另一个常见的情况是,您无法保持主应用程序运行,因此您无法将文件保存在内存中。在这种情况下,摆脱文件并使用数据库。您可以使用的任何数据库很可能比您想出的任何数据库都快。然而,在系统之间传输数据库并不容易。

不过,文件格式很可能不是要考虑的真正问题。我已经阅读了很多非常长的 CSV 文件,并且大多数情况下,与我之后需要处理的数据相比,读取文件所花费的时间可以忽略不计。

于 2012-06-04T18:42:12.570 回答
1

将其“转换”(即导入)到具有可搜索列上的索引和具有最高基数的列上的主键的数据库表(或最好是规范化表)中 - 无需重新发明轮子......你'将为自己节省很多问题 - 事务管理,并发......真的 - 如果它将在生产中,您希望将其保留为 csv 格式的机会几乎为零。

于 2012-06-04T18:47:25.327 回答
1

如果您有太多数据并且非常生产级别,那么使用Apache Lucene

如果它的小数据集或关于学习的,那么阅读后缀树尝试

于 2012-06-04T18:26:40.550 回答
0

如果文件太大而无法保存在内存中,那么只需将密钥保存在内存中即可。一些行数也可以保留在内存中,当需要额外的行时,将最近最少访问的行分页。对文件使用 fseeks(由键指示)来查找文件本身中的行。然后将该行加载到内存中,以防可能需要该行上的其他条目。

于 2016-01-14T14:57:45.760 回答