专栏名称: 老齐Py
Data Science
目录
相关文章推荐
中国人民银行  ·  李强主持召开国务院第八次全体会议 ... ·  2 天前  
中国人民银行  ·  2025年2月金融统计数据报告 ·  3 天前  
中国人民银行  ·  中国人民银行召开2025年信贷市场工作会议 ·  3 天前  
51好读  ›  专栏  ›  老齐Py

【译】利用Pandas和SQLite提升超大数据的读取速度

老齐Py  · 掘金  ·  · 2020-03-31 02:33

正文

阅读 32

【译】利用Pandas和SQLite提升超大数据的读取速度

作者:Itamar Turner-Trauring

翻译:老齐

与本文相关的图书推荐:《跟老齐学Python:数据分析》


让我们想象,你有一个非常大的数据集,以至于读入内存之后会导致溢出,但是你想将它的一部分用Pandas进行处理,如果你在某个时间点只是想加载这个数据集的一部分,可以使用分块方法。

如果把数据集分为若干部分之后,分别加载进来,最终还是会很慢。

此时的解决方法,就是创建一个可供搜索的索引,使用SQLite就能轻松解决。

第一个方法:分块

来设想一个具体的示例:你要参加某个竞选,为此,你找到了一个CSV文件,里面包含你所在城市每个选民的信息。于是乎你派人去挨门挨户地拜访,邀请特定街道的所有登记选民参与投票。

现在,Pandas的DataFrame对象中有索引,但是必须要将数据读入内存,然而CSV文件太大了,内存无法容纳,于是,你想到,可以只载入你关注的记录。

这就是第一个方法,进行分块。

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文件,并且按照街道名称进行筛选,然后将得到记录并为一体。

虽然逐行加载,但是关注的是比较小的子集,所以需要一些开销。比如,对于只有70k的数据集,在我的计算机上执行上面的函数,需要574ms。2018年纽约市有460万登记选民,挨个街道查找,需要30s。

如果我们只做一次,没关系,如果需要反复做,这种方法并不是最佳。

创建索引对象

索引就是摘要,有这样一种说法:如果你关心它,就能在这里找到大量数据。在我们的示例中,我们想根据街道名称创建索引,于是就可以快速加载投票者所在的街道了。







请到「今天看啥」查看全文