我正在尝试在python中执行一些n-gram计数,我想我可以使用MySQL(MySQLdb模块)来组织我的文本数据。
我有一个非常大的表,大约10mil记录,表示由唯一数字id(自动增量)和语言varchar
字段索引的文档(例如“en”,“de”,“ es“etc ..)
select * from table
太慢而且记忆力很强。
我最终将整个id范围拆分为更小的范围(每个记录宽度为2000条记录)并逐个处理每个较小的记录集,查询如下:
select * from table where id >= 1 and id <= 1999
select * from table where id >= 2000 and id <= 2999
依旧......
有没有什么方法可以更有效地使用MySQL并获得与串行读取大型语料库文本文件类似的性能?
我不关心记录的排序,我只是希望能够处理与我的大表中某种语言相关的所有文档。
答案 0 :(得分:1)
您可以使用HANDLER语句以块的形式遍历表(或索引)。这不是非常便携,如果行在您查看时出现和消失,则会以“有趣”的方式处理事务(提示:您不会获得一致性)但是对于某些应用程序来说代码更简单。
通常,您将获得性能损失,就好像您的数据库服务器是计算机的本地服务器,数据的多个副本(在内存中)以及其他一些处理。这是不可避免的,如果它真的困扰你,你不应该为此目的使用mysql。
答案 1 :(得分:0)
除了在您用于过滤查询的任何列上定义索引(可能是语言和ID,其中ID已经具有主键的索引关注),否。
答案 2 :(得分:0)
首先:如果您可以指定所需的列(在本例中为lang和doc),则应避免使用*。第二:除非你经常更改数据,否则我没有看到存储所有数据的重点 这在数据库中,特别是如果您正在存储文件名。例如,您可以使用xml格式(并使用SAX API进行读/写)
如果你想要一个比MySQL更快的数据库,你可以考虑一个内存数据集,例如SQLite或BerkeleyDb,它们都有python绑定。
格尔茨, 学家