2010-09-10 58 views
1

我有一个任务,并希望在我脑海中发展我应该如何编程这个。perl和巨大的数据库,如何搜索和存储?

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

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

任何样品编码将理解

回答

6

您可能想要使用适当的数据库解决方案。最简单的设置(取决于你对RDBMSes的熟悉程度)可能是MySQL。一旦你完成了设置,你就需要查看Perl模块来与数据库进行交互。 DBIx::Class这些日子是“在事物中”,因此,有很多人在使用它来回答问题。

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

2

大多数数据库将具有直接加载CSV文件到一个表的装置。例如Oracle的SQLLoader或MySQL的load命令。

以高效方式搜索数据库将取决于数据以及您希望如何搜索数据库。 (即哪些字段会很有趣,哪些字段可能会分类等)。如果没有更多信息,很难给出一个确凿的答案,尽管您应该遵循索引的一般最佳实践。

用于访问数据库的关于代码示例,请访问以下链接:

MySQL DBI Example

PERL DBI Doc

0

有时Perl的惊喜,你与它在处理基本方案的效率。也就是说,如果你的用例全部是只读的,并且信息是静态的/不变的,我会看到如何开放文件和搜索它的第一个工作的蛮力方法。

假设这是不可接受的,那么您只需要看DBI,Perl与数据库交谈的方式,并运行一次数百万次的插入,然后您的读取将快速使用现代RDBMS,如MySQL或SQL服务器。

1

首先,使用T ext::CSV_XS解析CSV文件。

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

如果你正在做简单的关键字匹配,那么一个键值存储将会非常快。像伯克利DB这样的事情会很好。

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

3

PostgreSQL已导入CSV文件的能力:
http://www.postgresql.org/docs/current/static/sql-copy.html
COPY命令也比犯36M插入,一次一个效率更高。

您应该研究一下在数据库管理系统上设计数据后如何导入数据。尽管如此,有很多记录我都不会清楚MySQL

如果数据不是关系性的并且只会变大,您可能需要使用Hadoop或某种其他形式的MapReduce进行调查。它会将这30分钟的查询变成5分钟。

+0

你能说明为什么MySQL不应该用于3600万条记录吗?最好给你的断言提供理由,而不是把它们扔到那里。 – CanSpice 2010-09-10 18:55:58

+0

成本考虑,我以前主要使用MySQL,因为它是托管公司使用的默认设置(LAMP:Linux/Apache/PHP/MySQL)的一部分。它达到了它的目的,但我也注意到某些记录没有被记录下来,它不是最有效的数据库。 PostgreSQL是一个免费的选择,它有更多的选择,既可靠又高效。 – vol7ron 2010-09-10 23:02:08

+0

自从Oracle收购MySQL以来,我还有一个担忧。甲骨文将如何对待它是值得怀疑的。他们可以采取一些专有工程并更新它,或者他们可以完全淘汰(更可能)。无论如何,PostgreSQL拥有出色的用户和开发人员社区。尽管它是一个很好的免费数据库,但Oracle,SQL Server和DB2都有其优势,但是需要付出代价。 – vol7ron 2010-09-10 23:05:47

0

Oracle已经购买了MySQL,这是一个值得关注的问题,但我认为MariaDB与最新的MySQL一样好或者更好....我还没有看到基准测试...只是在本文中发现它缺失所以提到。

anonymus