【问题标题】:perl and huge databases, how to search and store?perl 和庞大的数据库,如何搜索和存储?
【发布时间】:2011-04-10 20:11:22
【问题描述】:

我有一个任务并且想在我的脑海中发展我应该如何进行编程。

我可能会得到一个 csv 格式的数据库,其中至少有 3600 万行数据。未来,用户需要根据多列值根据某些条件通过CGI/perl接口搜索这个“数据库”,并显示匹配的行。

我应该如何使用 perl 读取 csv 格式(可能使用 CPAN 中的 CSV 解析器)并存储到什么类型的数据库中? 关键优先事项是搜索数据库的速度。

任何示例编码都将不胜感激

【问题讨论】:

    标签: perl


    【解决方案1】:

    您可能想要使用适当的数据库解决方案。最容易设置(取决于您对 RDBMS 的熟悉程度)可能是 MySQL。完成设置后,您需要查看 Perl 模块以与数据库交互。 DBIx::Class 是当今的“流行”,因此有很多人可以使用它来回答问题。

    哦,对于您的 CSV 解析,如果您不想将其直接加载到数据库中(并且如果您选择的 RDBMS 不支持直接提取 CSV 文件),请查看 Text::CSV。

    【讨论】:

      【解决方案2】:

      PostgreSQL可以导入CSV文件:
      http://www.postgresql.org/docs/current/static/sql-copy.html
      COPY 命令也比提交 36M 插入更有效,一次一个。

      在 DBMS 上进行设计后,您应该研究导入数据的方法。不过,有了这么多记录,我会远离MySQL。

      如果数据不是相关的并且只会变得更大,您可能需要考虑使用Hadoop,或其他形式的MapReduce。它将把这 30 分钟的查询变成 5 分钟。

      【讨论】:

      • 你能给出为什么不应该将 MySQL 用于 3600 万条记录的原因吗?最好为你的断言给出理由,而不是把它们扔在那里。
      • 考虑到成本,我过去主要使用 MySQL,因为它是托管公司使用的默认设置的一部分(LAMP:Linux/Apache/PHP/MySQL)。它达到了它的目的,但我也注意到某些记录没有被考虑在内,它不是最有效的数据库。 PostgreSQL 是免费的替代品,它有更多的选择,而且既可靠又高效。
      • 自从甲骨文收购 MySQL 以来,我还有一个额外的担忧。甲骨文将如何对待它是值得怀疑的。他们可以采用他们的一些专有工程并对其进行更新,或者他们可以完全淘汰它(更有可能)。无论如何,PostgreSQL 有一个很棒的用户和开发者社区。虽然它是一个很棒的免费数据库,但 Oracle、SQL Server 和 DB2 也各有优势,但要付出一定的代价。
      【解决方案3】:

      大多数数据库都可以将 CSV 文件直接加载到表中。例如,SQLLoader 用于 Oracle,load 用于 MySQL。

      以有效的方式搜索数据库将取决于数据以及您期望的搜索方式。 (即哪些字段会很有趣,您可以对哪些字段进行排序等。)如果没有更多信息,很难给您一个可靠的答案,尽管您应该遵循一般的索引最佳实践。

      有关访问数据库的代码示例,请参见以下链接:

      MySQL DBI Example

      PERL DBI Doc

      【讨论】:

        【解决方案4】:

        首先,使用 Text::CSV_XS 解析为 CSV 文件。

        其次,使用什么样的数据库以及应该如何构建它取决于将要进行什么样的搜索。

        如果您正在做简单的关键字匹配,那么键值存储将非常快。像 Berkeley DB 这样的东西会做得很好。

        如果您有更复杂的需求,您可能需要考虑使用 MySQL、PostgreSQL、Oracle、SyBase 等 SQL 数据库。 SQL 数据库调优和设计本身就是一个完整的研究领域。不过,我将提供一些建议,并建议您需要非常仔细地考虑可以将哪些索引应用于您的字段,以便最大限度地提高查询速度。

        【讨论】:

          【解决方案5】:

          有时 Perl 在处理基本场景方面的效率会让您大吃一惊。也就是说,如果您的用例都是只读的并且信息是静态/不变的,我会先看看打开文件并搜索它的蛮力方法是如何工作的。

          假设这是不可接受的,那么您只需查看 DBI(Perl 与数据库通信的方式)并运行一次数百万次插入,然后使用 MySQL 或 SQL Server 等现代 RDBMS 进行读取将很快.

          【讨论】:

            猜你喜欢
            • 2014-03-12
            • 2013-10-31
            • 1970-01-01
            • 1970-01-01
            • 2012-02-08
            • 1970-01-01
            • 1970-01-01
            • 2011-08-24
            • 1970-01-01
            相关资源
            最近更新 更多