2012-06-04 61 views
2

如果我有一个CSV文件,将文件保存为放置文本还是将其转换为其他格式会更快? (用于搜索)CSV文件,二进制格式更快?最快的搜索?

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

有些更新:

  1. 文件将被只读
  2. 文件可以被读取并保存在内存中
+1

您的CSV文件有多大? –

+0

@HunterMcMillen说100万行,我编辑了这个问题,寻找没有排序的查找算法。 – loyalflow

回答

1

如果你有太多的数据,是非常的生产水平,然后使用Apache Lucene

如果它的小数据集或其关于学习,然后通过Suffix treeTries

2

有几件事情要考虑这一点:

  • 你存储什么样的数据?它是否有意义,将其转换为二进制格式?二进制格式会占用较少的空间(读取文件所花费的时间取决于大小)?

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

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

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

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

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

+0

该文件将是只读文件,没有突变。 – loyalflow

+0

+1决定前的所有注意事项。即使这看起来更像一个Programmers.SE的答案。 –

+0

@ user1361315:如果您可以将文件保存在内存中,则完全不关心格式。将文件解析为针对您的查询类型优化的数据结构并使用该数据结构。分析您所期望的类型查询并实现数据结构将有足够的工作量,因此花了您的时间在此优化。您的问题使您看起来像计划将文件保存在内存中,就像字节流一样(即不解析它)。这将是一个非常愚蠢的想法,因为解析会让你的生活更轻松。无论文件格式如何,解析后的内存结构都是一样的。 – LiKao

1

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

+0

我正在寻找我的问题的答案,而不是一个替代解决方案:) – loyalflow

+1

它将其转换成数据库更快。那回答你的问题:) – Nathan

0

如果文件太大而不能保存在内存中,那么只需将这些键保存在内存中。一些行数也可以保存在内存中,最近访问的行被分页出去,因为需要额外的行。使用fseeks(通过键指示)和文件来查找文件本身中的行。然后将该行加载到内存中,以防需要该行上的其他条目。