Python海量数据的生成与处理

简介: 文章目录Python海量数据的生成与处理概述生成1亿条数据直接读取测试

Python海量数据的生成与处理

参考:https://blog.csdn.net/quicktest/article/details/7453189

概述

生成1亿条数据

代码如下:

# 生成1亿个IP
def generateRandom(rangeFrom, rangeTo):
    import random
    return random.randint(rangeFrom,rangeTo)
def generageMassiveIPAddr(fileLocation,numberOfLines):
    IP = []
    file_handler = open(fileLocation, 'a+')
    for i in range(numberOfLines):
        IP.append('10.197.' + str(generateRandom(0,255))+'.'+ str(generateRandom(0,255)) + '\n')
    file_handler.writelines(IP)
    file_handler.close()
if __name__ == '__main__':
    from time import ctime
    print(ctime())
    for i in range(10):
        print( '  ' + str(i) + ": " + ctime())
        generageMassiveIPAddr('d:\\massiveIP.txt', 10000000)
    print(ctime())

程序输出如下:

Thu Dec 30 13:01:34 2021
  0: Thu Dec 30 13:01:34 2021
  1: Thu Dec 30 13:02:12 2021
  2: Thu Dec 30 13:02:50 2021
  3: Thu Dec 30 13:03:28 2021
  4: Thu Dec 30 13:04:07 2021
  5: Thu Dec 30 13:04:45 2021
  6: Thu Dec 30 13:05:25 2021
  7: Thu Dec 30 13:06:07 2021
  8: Thu Dec 30 13:06:46 2021
  9: Thu Dec 30 13:07:25 2021
Thu Dec 30 13:08:04 2021

可以看出,每1千万条数据需要40s左右,1亿条一共耗时6min30s,一共330s。

生成的文件大小为:

1.4GB

直接读取测试

加载数据

代码如下:

import pandas as pd
from time import ctime
print(ctime())
df = pd.read_csv("d:\\massiveIP.txt",header=None,names=["IP"])
print(ctime())

用时 29s,输出如下:

Thu Dec 30 13:20:24 2021
Thu Dec 30 13:20:53 2021

查看占用内存大小:

df.info()

输出如下:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100000000 entries, 0 to 99999999
Data columns (total 1 columns):
 #   Column  Dtype 
---  ------  ----- 
 0   IP      object
dtypes: object(1)
memory usage: 762.9+ MB

确定重复次数的最大值

确定重复值的个数

可以采用value_counts():

value_counts()是一种查看表格某列中有多少个不同值的快捷方法,并计算每个不同值有在该列中有多少重复值。

value_counts()是Series拥有的方法,一般在DataFrame中使用时,需要指定对哪一列或行使用

%%time
df1 = df["IP"].value_counts()
df1

输出:

Wall time: 31.6 s
10.197.87.47      1678
10.197.38.53      1677
10.197.42.238     1676
10.197.28.183     1676
10.197.63.208     1674
                  ... 
10.197.30.195     1381
10.197.91.33      1379
10.197.7.231      1376
10.197.11.136     1366
10.197.241.199    1358
Name: IP, Length: 65536, dtype: int64

耗时31.6s

生成10亿条数据

由于生成1亿条数据没压力,现在生成5亿条数据

将:

if __name__ == '__main__':
    from time import ctime
    print(ctime())
    for i in range(50): # 原来为10,现在修改为50
        print( '  ' + str(i) + ": " + ctime())
        generageMassiveIPAddr('d:\\massiveIP.txt', 10000000)
    print(ctime())

耗时27min35.8s,

生成的文件大小为:7.04GB,共7559142440.96字节

一共5亿条数据,每条15.12个字节

输出为:

Thu Dec 30 15:04:51 2021
  0: Thu Dec 30 15:04:51 2021
  1: Thu Dec 30 15:05:32 2021
  2: Thu Dec 30 15:06:12 2021
  3: Thu Dec 30 15:06:51 2021
  4: Thu Dec 30 15:07:29 2021
  5: Thu Dec 30 15:08:08 2021
  6: Thu Dec 30 15:08:48 2021
  7: Thu Dec 30 15:09:30 2021
  8: Thu Dec 30 15:10:11 2021
  9: Thu Dec 30 15:10:51 2021
  10: Thu Dec 30 15:11:30 2021
  11: Thu Dec 30 15:12:10 2021
  12: Thu Dec 30 15:12:54 2021
  13: Thu Dec 30 15:13:42 2021
  14: Thu Dec 30 15:14:23 2021
  15: Thu Dec 30 15:15:05 2021
  16: Thu Dec 30 15:15:44 2021
  17: Thu Dec 30 15:16:25 2021
  18: Thu Dec 30 15:17:05 2021
  19: Thu Dec 30 15:17:45 2021
  20: Thu Dec 30 15:18:23 2021
  21: Thu Dec 30 15:19:03 2021
  22: Thu Dec 30 15:19:47 2021
  23: Thu Dec 30 15:20:34 2021
  36: Thu Dec 30 15:29:28 2021
  37: Thu Dec 30 15:30:12 2021
  38: Thu Dec 30 15:30:58 2021
  39: Thu Dec 30 15:31:46 2021
Thu Dec 30 15:32:27 2021

直接读取测试

加载数据

代码如下:

import pandas as pd
from time import ctime
print(ctime())
df = pd.read_csv("d:\\massiveIP.txt",header=None,names=["IP"])
print(ctime())

打开资源监视器,会查看到占用内存情况:



vscode占用内存增加较快,我不断的关掉qq,关掉钉钉,关掉不用的浏览器,结果。。。

在2min49.5s后,输出如下:

MemoryError: Unable to allocate 3.73 GiB for an array with shape (500000000,) and data type object

这时程序即使终端,也不会释放内存,可以手动释放内存

a = []
for x in locals().keys():
    print(x)
    a.append(x)
import gc
# for i in a:
        # del locals()[x]
gc.collect()

如果想调整可以内存大小,可参考:

https://blog.csdn.net/com_fang_bean/article/details/106862052

但这里我就不再调整内存大小,而是通过别的手段来加载数据。

通过分块加载数据

代码:

import pandas as pd
from tqdm import tqdm
f = open('d:\\massiveIP.txt')
reader = pd.read_csv(f, sep=',',header=None,names=["IP"], iterator=True)
loop = True
chunkSize = 100000000
chunks = []
for i in tqdm(range(10)) :
    try:
        chunk = reader.get_chunk(chunkSize)
        df1 = chunk["IP"].value_counts()
        chunks.append(df1)
        del chunk
    except StopIteration:
        # loop = False
        print("Iteration is stopped.")

耗时6m3.6s

输出为:

100%|██████████| 10/10 [06:03<00:00, 36.33s/it]

加载每个块的统计结果

代码:

re_chunks = []
for i in chunks:
    df1 = i.reset_index()
    re_chunks.append(df1)
df22 = pd.concat(re_chunks, ignore_index=True)
df22

输出为:

  index IP
0 10.197.87.47  1678
1 10.197.38.53  1677
2 10.197.42.238 1676
3 10.197.28.183 1676
4 10.197.63.208 1674
... ... ...
327675  10.197.215.196  1380
327676  10.197.18.130 1379
327677  10.197.251.175  1371
327678  10.197.57.85  1368
327679  10.197.115.87 1358

通过分组聚合重置排序获取IP数量的值

df22.groupby(by=["index"]).agg({"IP":"sum"}).reset_index().sort_values(by=["IP"],ascending=False)

输出如下:

index IP
32949 10.197.213.31 7982
48006 10.197.37.219 7972
63967 10.197.93.7 7961
40524 10.197.240.167  7946
45524 10.197.28.6 7945
... ... ...
54610 10.197.60.172 7302
8240  10.197.127.141  7293
59005 10.197.76.210 7292
38627 10.197.233.73 7286
11341 10.197.138.168  7282

校验结果是否正确

df22["IP"].sum()

输出如下:

500000000

与原始数量一致,表示过程没有问题,到此,基于pandas的海量数据处理顺利完成。

相关文章
|
8月前
|
算法 数据挖掘 Python
海量数据,3行Python代码直接获取!
海量数据,3行Python代码直接获取!
220 0
|
5月前
|
数据挖掘 数据处理 Python
数据处理新纪元:Python集合内置方法让你告别繁琐,轻松驾驭海量数据!
【8月更文挑战第22天】本文通过电商用户购买数据案例,展示了Python集合在高效数据处理中的应用。首先,利用Pandas读取`purchase_data.csv`文件,并通过内置方法快速概览数据。接着,创建商品ID集合进行数据分析,运用集合的并集、交集及差集等运算揭示用户购买行为模式。最后,借助集合推导式精简创建用户购买商品集合的过程,全方位呈现集合的强大功能。
31 0
|
分布式计算 并行计算 数据可视化
战斗到底:Java vs. Python - 用哪个更适合处理海量数据?
战斗到底:Java vs. Python - 用哪个更适合处理海量数据?
1052 0
|
存储 算法 数据挖掘
用Python解决海量数据的分类汇总~一键化办公的神器
用Python解决海量数据的分类汇总~一键化办公的神器
468 0
用Python解决海量数据的分类汇总~一键化办公的神器
|
算法 数据挖掘 Python
海量数据,3行Python代码直接获取!
海量数据,3行Python代码直接获取!
海量数据,3行Python代码直接获取!
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
21天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
105 80
|
9天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
30 14