沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!
- for row in iter_data():
- connection.execute('INSERT INTO my_table VALUES (?)', row)
我比来在涉及大年夜量数据处理的项目中频繁应用 sqlite3。我最初的测验测验根本不涉及任何数据库,所有的数据都将保存在内存中,包含字典查找、迭代和前提等萌芽。这很好,但可以放入内存的只有那么多,并且将数据大年夜磁盘从新生成或加载到内存是一个繁琐又耗时的过程。
我决定试一试sqlite3。 因为只需打开与数据库的连接, 如许可以增长可处理的数据量,并将应用法度榜样的加载时光削减到零。此外,我可以经由过程 SQL 萌芽调换很多Python逻辑语句。
我想分享一些关于此次经历的心得和发明。
TL;DR
- 应用大年夜量操作 (别名 executemany)。
- 你不须要应用光标 (大年夜部分时光)。
- 光标可被迭代。
- 应用高低文治理器。
- 应用编译指导 (当它有意义)。
- 推迟索引创建。
- 应用占位符来插入 python 值。
1. 应用大年夜量操作
如不雅你须要在数据库一一次性插入很多行,那么你真不该该应用 execute。sqlite3 模块供给了批量插入的方法:executemany。
而不是像如许做:
类似的操作可以直接在连接上调用。以下是一个证实此事的示例:
- connection.executemany(
- 'INSERT INTO my_table VALUE (?)',
- iter_data()
- )
- for row in connection.execute('SELECT * FROM events'):
- print(row)
这不仅更简洁,并且更高效。实际上,sqlite3 在幕后应用 executemany 实现 execute,但后者插入一行而不是多行。
我写了一个小的基准测试,将一百万行插入空表(数据库在内存中):
- executemany: 1.6 秒
- execute: 2.7 秒
2. 你不须要游标
一开端我经常搞混的工作就是,光标治理。在线示例和文档中平日如下:
- connection = sqlite3.connect(':memory:')
- cursor = connection.cursor()
- # Do something with cursor
但大年夜多半情况下,你根本不须要光标,你可以直接应用连接对象。
像 execute
6. 推迟索引创建
- executemany
- import sqlite3
- connection = sqlite3(':memory:')
- # Create a table
- connection.execute('CREATE TABLE events(ts, msg)')
- # Insert values
- connection.executemany(
推荐阅读
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散! 这个电脑法度榜样是Willem van Hoorn脑力劳动的产品。van Hoorn是应用人工智能设计药物的始创公司—&>>>详细阅读
地址:http://www.17bianji.com/lsqh/38253.html
1/2 1