ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python海量数据如何快速查询?

2022-01-08 14:34:21  阅读:286  来源: 互联网

标签:... python 数据库 查询 海量 sqlite3 序列化 data conn


转自:微点阅读  https://www.weidianyuedu.com

在实际工作中,经常会遇到查询的任务,比如根据某些rs号,检索dbsnp数据库,提取这些snp位点的信息,对于这样的任务,最基本的操作方法是将数据库的内容存为字典,然后检索特定的key即可。对于小文件而言,这样的操作编码简单,运行速度也比较满意,但是对于大型数据库而言,将数据库存为字典这个动作是非常耗费时间的,而且每次运行代码都要执行这样的操作,导致效率大大降低。想要改善这一状况,有以下两种解决办法1. 对象序列化

对象序列化就是将python中的对象保存为二进制的字节流文件,与之相对的是反序列化, 从二进制文件中读取内容,重新解析为python对象。通过序列化,只需要读取一次数据库,然后将生存的字典对象保存为一个文件,后续在使用时,直接读取序列化产生的文件,就可以快速得到数据库对应的字典。

在python中,通过内置模块pickle进行序列化相关操作,用法如下微点阅读(www.weidianyuedu.com)

>>> import pickle>>>>>> data = {1:"A", 2:"B", 3:"C"}# dump 进行序列化>>> with open("out", "wb") as f:... pickle.dump(data, f)...>>># load 进行反序列化>>> with open("out", "rb") as f:... data = pickle.load(f)...>>> data{1: "A", 2: "B", 3: "C"}2. 使用数据库

对于数据检索这种任务,在工业界有成熟的解决方案——专用的数据库软件,比如耳熟能详的mysql等关系型数据库,以及redis等非关系型数据库。在python3中,内置了模块sqlite3, 支持创建sqlite3数据库,一个轻量级,文本型的数据库。用法如下

>>> import sqlite3>>>>>>>>># 创建数据库# 连接数据库>>> conn = sqlite3.connect("test.db")# 创建游标>>> c = conn.cursor()>>> c.execute("""CREATE TABLE alphabet (cnt integer, date text)""")<sqlite3.Cursor object at 0x7f3e514413b0>>>>>>> for key, value in data.items():... c.execute("INSERT INTO alphabet VALUES (?, ?)", (key, value))...<sqlite3.Cursor object at 0x7f3e514413b0><sqlite3.Cursor object at 0x7f3e514413b0><sqlite3.Cursor object at 0x7f3e514413b0>>>> conn.commit()>>> conn.close()

# 使用数据库>>> conn = sqlite3.connect("test.db")>>> c = conn.cursor()>>> for row in c.execute("SELECT * FROM alphabet WHERE cnt <= 2"):... print(row)...(1, "A")(2, "B")将数据存储在数据库中,称之为对象持久化,除了sqlite3之外,python也支持mysql等其他数据库,只需要安装对应的模块即可。

                                                                                     ·end·

标签:...,python,数据库,查询,海量,sqlite3,序列化,data,conn
来源: https://blog.csdn.net/ysds20211402/article/details/122379681

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有