1

我正在尝试在 python 中执行一些 n-gram 计数,我认为我可以使用 MySQL(MySQLdb 模块)来组织我的文本数据。

我有一个很大的表,大约 1000 万条记录,表示由唯一数字 id(自动增量)和语言varchar字段(例如“en”、“de”、“es”等)索引的文档

select * from table太慢了,内存破坏性很大。我最终将整个 id 范围拆分为更小的范围(例如每个 2000 条记录宽),并使用以下查询逐个处理这些较小的记录集:

select * from table where id >= 1 and id <= 1999
select * from table where id >= 2000 and id <= 2999

等等...

有什么方法可以更有效地使用 MySQL 并获得与连续读取大型语料库文本文件类似的性能?

我不关心记录的顺序,我只想能够处理我的大表中与某种语言有关的所有文档。

4

3 回答 3

1

您可以使用 HANDLER 语句以块的形式遍历表(或索引)。这不是很便携,并且如果在您查看行时出现和消失,则以“有趣”的方式处理事务(提示:您不会获得一致性),但会使某些应用程序的代码更简单。

通常,您会受到性能影响,就好像您的数据库服务器位于机器本地一样,需要多个数据副本(在内存中)以及其他一些处理。这是不可避免的,如果它真的困扰你,你不应该为此目的使用 mysql。

于 2010-12-10T14:46:55.443 回答
0

除了在您用于过滤查询的任何列上定义索引(可能是语言和 ID,其中 ID 已经具有主键的索引)之外,没有。

于 2010-12-10T14:45:00.167 回答
0

首先:如果可以指定所需的列(在这种情况下为 lang 和 doc),则应避免使用 *。第二:除非您经常更改数据,否则我看不出将所有这些都存储在数据库中的意义,尤其是在您存储文件名的情况下。例如,您可以使用 xml 格式(并使用 SAX api 读/写)

如果你想要一个 DB 和比 MySQL 更快的东西,你可以考虑一个内存数据库,比如 SQLite 或 BerkeleyDb,它们都有 python 绑定。

格雷茨,J.

于 2010-12-10T15:17:10.220 回答