做者:Itamar Turner-Trauringpython
翻译:老齐sql
与本文相关的图书推荐:《跟老齐学Python:数据分析》数据库
让咱们想象,你有一个很是大的数据集,以致于读入内存以后会致使溢出,可是你想将它的一部分用Pandas进行处理,若是你在某个时间点只是想加载这个数据集的一部分,可使用分块方法。bash
若是把数据集分为若干部分以后,分别加载进来,最终仍是会很慢。服务器
此时的解决方法,就是建立一个可供搜索的索引,使用SQLite就能轻松解决。markdown
来设想一个具体的示例:你要参加某个竞选,为此,你找到了一个CSV文件,里面包含你所在城市每一个选民的信息。因而乎你派人去挨门挨户地拜访,邀请特定街道的全部登记选民参与投票。app
如今,Pandas的DataFrame对象中有索引,可是必需要将数据读入内存,然而CSV文件太大了,内存没法容纳,因而,你想到,能够只载入你关注的记录。函数
这就是第一个方法,进行分块。oop
import pandas as pd def get_voters_on_street(name): return pd.concat( df[df["street"] == name] for df in pd.read_csv("voters.csv", chunksize=1000) ) 复制代码
以分块的方式加载CSV文件,而且按照街道名称进行筛选,而后将获得记录并为一体。spa
虽然逐行加载,可是关注的是比较小的子集,因此须要一些开销。好比,对于只有70k的数据集,在个人计算机上执行上面的函数,须要574ms。2018年纽约市有460万登记选民,挨个街道查找,须要30s。
若是咱们只作一次,不要紧,若是须要反复作,这种方法并非最佳。
索引就是摘要,有这样一种说法:若是你关心它,就能在这里找到大量数据。在咱们的示例中,咱们想根据街道名称建立索引,因而就能够快速加载投票者所在的街道了。
若是你担忧索引数据也会超出内存,那么数据库则能做为保存它们的容器,例如PostgreSQL、MySQL等数据库都能实现。哦,你不喜欢安装和维护那些讨厌的服务,好吧,SQLite应运而生了。
SQLite是一个功能齐全的关系型数据库,它可以像其它数据库同样运行,可是不须要服务器。Pyhton默认就支持这种数据库。SQLite将数据保存在独立的文件中,你必须管理一个SQLite数据文件,而不是CSV文件了。
下面演示一下如何用Pandas操做SQLite:
SQLite数据库可以保存多张数据表,首先将voters.csv文件的数据载入SQLite,并保存为voters.sqlite文件,在这个文件中,咱们建立一个名为voters的表。
接下来,在SQLite中建立街道的索引。
只需以下操做:
import sqlite3 # Create a new database file: db = sqlite3.connect("voters.sqlite") # Load the CSV in chunks: for c in pd.read_csv("voters.csv", chunksize=1000): # Append all rows to a new database table, which # we name 'voters': c.to_sql("voters", db, if_exists="append") # Add an index on the 'street' column: db.execute("CREATE INDEX street ON voters(street)") db.close() 复制代码
虽然咱们只建立单个索引,但咱们还能够在其余列或多个列上建立其余索引,从而容许咱们使用这些列快速搜索数据库。
如今,全部数据都已经载入SQLite,咱们能够按照街道进行检索了。
def get_voters_for_street(street_name): conn = sqlite3.connect("voters.sqlite") q = "SELECT * FROM voters WHERE street = ?" values = (street_name,) return pd.read_sql_query(q, conn, values) 复制代码
执行上述函数,SQLite只加载与查询匹配的行,并其经过Pandas将它们保存为DataFrame对象。
那个CSV文件供给70,000行记录,原来花费了574ms,如今只用了10ms。
提速50多倍,这是由于,只须要加载咱们关心的行,而不是CSV文件中的每一行。
原文连接:pythonspeed.com/articles/in…
搜索技术问答的公众号:老齐教室
在公众号中回复:老齐,可查看全部文章、书籍、课程。
以为好看,就点赞转发