Python处理海量数据集的3种方法分享
https://www.flypeng.com win10系统 发布时间:2023-04-22 09:19 来源:未知

作为一名数据科学家,我发现自己处理“大数据”的情况越来越多。我叫做大数据的是那些虽然不是很大,但是却足够让我的电脑处理到崩溃并且拖慢其他程序。

 

图片来自 Mika Baumeister UNsplash

 

这个问题并不新鲜,且对于所有问题而言,从来没有一劳永逸的万能公式。最好的方法依赖于你的数据以及你应用的目的。然而,最流行的解决方法通常在以下描述的分类之中。

 

1. 通过优化数据类型来减少内存使用

 

当使用Pandas从文件里加载数据的时候,如果不提前设定,通常会自动推断数据类型。

 

多数情况下这没什么问题,但是推断的数据类型并不一定是最优的。甚至,如果数值型列数据包括了缺失值,推断数据类型就会自动填充为浮点型。

 

在我处理大部分表征年、月或日的整型数据的时候,我最近通常会使用这种方法进行分析:

 

使用Pandas加载文件并明确数据类型(图片来自作者)

 

对于特定的案例,明确数据类型会让使用内存大大减少。请注意上述例子中用到的pandas类型pandas.Int16Dtype来使包含缺失值的列数据强制转换成整型数据。当在处理大型数据集时,需要你拥有对拟处理数据集的一些先验知识,因而会通过在内部使用pandas.NA而非numpy.nan来实现缺失值的最优数据类型。在纯粹探索未知数据集的时候该方法可能并不适用。

 

2. 将数据分块

 

当数据太大以至于与内存不相符,你可以使用Pandas的chunksize选项来将数据集分块,而非处理一大整块数据。使用该选项创造迭代器对象用于浏览不同块,并像加载整个数据集时进行过滤或分析。

 

以下是使用该选项浏览Yelp reviews 数据集的例子,提取每个块里评论日期的最小值和最大值,然后重建评论的完整时间跨度:

 

reader = pd.read_json(reviews_path, lines=True, orient = "records", chunksize = 100000)    
 # go through the chunks and extract min/max date    
 date_limits = []  
for chunk in reader:   
 date_limits.append(max(chunk.date))        
 date_limits.append(min(chunk.date))   
  print("Reviews span from {} to {}". format(min(date_limits).strftime('%d-%m-%Y'),   
  max(date_limits).strftime('%d-%m-%Y')))    

 

分块可用于最初的探索性分析到模型训练,仅需极少的额外启动即可实现。

 

3. 利用惰性计算

 

惰性计算指的是仅仅在真正需要执行的时候才计算的表达式。惰性计算是一个重要的概念(尤其在功能编程当中使用),如果你想阅读更多关于它在python中的不同用法,你可以从这里开始

(https://towardsdatascience.com/what-is-


lazy-evaluation-in-python-9efb1d3bfed0)。

 

惰性计算是像Spark或者Dask这样的分配计算框架建立的基础。虽然他们设计用于聚类,你仍然可利用它们在你的个人电脑上处理大型数据集。

 

与Pandas主要的差异是它们不会直接在内存加载数据。相反,在读取命令的时候会扫描数据,推断数据类型并将其分成独立的部分(到目前为止没有新建)。仅仅在需要时独立为这些部分创建计算图形(因此叫做惰性)。

 

在之前的文章
https://towardsdatascience.com/a-pyspark-example-for-dealing-with-larger-than-memory-datasets-70dbc82b0e98)
里,我提供了一个Pyspark的例子,对一个大于内存的数据集做探索性分析。Dask也很流行,并且例子也不难找(你可以查看两者比较
https://docs.dask.org/en/latest/spark.html)
。Dask语法仿照Pandas的语法,所以看起来很相似,然而Dask仅限于Python使用,但Spark可以在Java或Scala中使用。

 

其他库例如Vaex或Modin也提供了相似的功能,但是我本人还没有尝试过。

如果你有好的win10资讯或者win10教程,以及win10相关的问题想要获得win10系统下载的关注与报道。
欢迎加入发送邮件到#qq.com(#替换为@)。期待你的好消息!