我有一个大约 170 万行、总计 1 GB 的电子表格,需要对其执行各种查询。作为对 Python 最熟悉的方法,我的第一种方法是将一堆字典拼凑在一起,这些字典的键控方式有助于我尝试进行的查询。例如,如果我需要能够访问具有特定区号和年龄的每个人,我会制作一个 areacode_age 二维字典。我最终需要其中不少,这增加了我的内存占用量(大约 10GB),即使我有足够的 RAM 来支持这一点,这个过程仍然很慢。
在这一点上,我好像在玩傻瓜游戏。“嗯,这就是关系数据库的用途,对吧?”,我想。我导入了 sqlite3 并将我的数据导入到内存数据库中。我认为数据库是为速度而构建的,这将解决我的问题。
但事实证明,执行“SELECT (a, b, c) FROM foo WHERE date1<=d AND date2>e AND name=f”之类的查询需要 0.05 秒。为我的 170 万行执行此操作需要 24 小时的计算时间。对于这个特定的任务,我使用字典的 hacky 方法大约快了 3 个数量级(而且,在这个例子中,我显然无法键入 date1 和 date2,所以我得到了与名称匹配的每一行,然后按日期过滤)。
所以,我的问题是,为什么这么慢,我怎样才能让它快呢?什么是 Pythonic 方法?我一直在考虑的可能性:
- sqlite3 太慢了,我需要更重量级的东西
- 我需要以某种方式更改我的架构或我的查询以更加......优化?
- 到目前为止我尝试过的方法是完全错误的,我需要某种全新的工具
- 我在某处读到,在 sqlite 3 中,重复调用 cursor.execute 比使用 cursor.executemany 慢得多。事实证明,executemany 甚至与 select 语句都不兼容,所以我认为这是一个红鲱鱼。
谢谢。