内存优化技巧:让数据处理更高效

Pandas无疑是我们数据分析时一个不可或缺的工具,它以其强大的数据处理能力、灵活的数据结构以及易于上手的API赢得了广大数据分析师和机器学习工程师的喜爱。

然而,随着数据量的不断增长,如何高效、合理地管理内存,确保Pandas DataFrame在运行时不会因内存不足而崩溃,成为我们每一个人必须面对的问题。

在这个信息爆炸的时代,数据规模呈指数级增长,如何优化内存使用,不仅关乎到程序的稳定运行,更直接关系到数据处理的效率和准确性。通过本文,你将了解到一些实用的内存优化技巧,帮助你在处理大规模数据集时更加得心应手。

1. 准备数据

首先,准备一些包含各种数据类型的测试数据集。
封装一个函数(fake_data),用来生成数据集,数据集中包含后面用到的几种字段。

import pandas as pd
import numpy as np

def fake_data(size):
    """
    根据测试数据集:
    age:整数类型数值
    grade:有限个数的字符串
    qualified:是否合格
    ability:能力评估,浮点类型数值
    """
    df = pd.DataFrame()
    df["age"] = np.random.randint(1, 30, size)
    df["grade"] = np.random.choice(
        [
            "一年级",
            "二年级",
            "三年级",
            "四年级",
            "五年级",
            "六年级",
        ],
        size,
    )
    df["qualified"] = np.random.choice(["合格", "不合格"], size)
    df["ability"] = np.random.uniform(0, 1, size)

    return df

2. 检测内存占用

使用上面封装的函数(fake_data)先构造一个包含一百万条数据的DataFrame

df = fake_data(1_000_000)
df.head()

image.png

看看优化前的内存占用情况:

df.info()

image.png


内存占用大约 26.7MB 左右。

3. 优化内存

接下来,我们开始一步步优化DataFrame的内存占用,
并测试每一步优化之后的内存使用情况和运行性能变化。

3.1. 优化整型数据

首先,优化整型数据的内存占用,也就是测试数据中的年龄age)字段。
从上面df.info()的结果中,我们可以看出,age的类型是int32(也就是用32位,8个字节来存储整数)。
对于年龄来说,用不到这么大的整数,用int8(数值范围:-128~127)来存储绰绰有余。

df["age"] = df["age"].astype("int8")
df.info()

image.png


优化之后,内存占用从26.7+ MB减到23.8+ MB

3.2. 优化浮点型数据

接下来优化浮点类型数据,也就是测试数据中的能力评估值ability)。
测试数据中ability的值是6位小数,类型是float64
转换成float16可能会改变值,所以这里转换成float32

df["ability"] = df["ability"].astype("float32")
df.info()

image.png


优化之后,内存占用进一步从23.8+ MB减到20.0+ MB

3.3. 优化布尔型数据

接下来,优化测试数据中的是否合格qualified),
这个值虽然是字符串类型,但是它的值只有两种(合格不合格),所以可以转换成布尔类型

df["qualified"] = df["qualified"].map({"合格": True, "不合格": False})
df.info()

image.png


优化之后,内存占用进一步从20.0+ MB减到13.4+ MB

3.4. 使用category类型

最后,我们再优化剩下的字段--年级grade)。

这个字段也是字符串,不过它的值只有6个,虽然无法转换成布尔类型(布尔类型只有两种值TrueFalse),但是它可以转换为pandas中的 category 类型。

df["grade"] = df["grade"].astype("category")
df.info()

image.png


优化之后,内存占用进一步从13.4+ MB减到6.7+ MB

4. 总结

各类字段优化之后,内存占用从刚开始的26.7+ MB减到6.7+ MB,优化的效果非常明显。

仅仅是数据类型的简单调整,就带来了如此之大的内存效率提升,
这也给我们带来启示,在数据分析的过程中,构造DataFrame时,也可以根据数值的范围,特点等,
来赋予它合适的类型,不要一味简单的使用字符串,或者默认的整数(int32),默认的浮点(float64)等类型。

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C#可以使用多线程和并行编程来高效处理大量数据。可以使用.NET Framework提供的并行编程库,如Parallel.For和Parallel.ForEach来实现并行循环。还可以使用TPL(Task Parallel Library)来创建和管理多个线程。此外,可以使用LINQ中的AsParallel()扩展方法将查询转换为并行查询。 ### 回答2: 在处理大量数据时,C#有以下几种方式可以提高处理效率: 1. 使用高效的数据结构:选择最合适的数据结构可以大大提高处理大量数据的效率。例如,使用List<T>而不是数组可以快速增加或删除数据;使用Dictionary<TKey, TValue>可以快速查找和检索数据。 2. 使用并行处理:利用多线程或并行处理库可以将数据处理任务分配给多个线程同时进行,从而提高处理速度。例如,使用Parallel.ForEach方法可以并行处理一个集合中的元素。 3. 批量处理数据:对于大量数据的处理,逐个处理每条数据可能会非常耗时。相反,可以将数据按照一定的批次读取进内存,进行批量处理,再将结果写回数据库或输出。这样可以减少I/O操作的次数,提高效率。 4. 使用延迟加载:对于大量数据,不需要一次性加载全部数据到内存中,而是可以根据需要延迟加载数据。例如,使用IEnumerable<T>接口可以将查询结果按需加载到内存中,避免一次性加载大量数据。 5. 使用合适的算法和优化技巧:选择合适的算法和使用优化技巧可以减少不必要的计算和内存开销,提高处理速度。例如,使用快速排序而不是冒泡排序来对大量数据进行排序。 6. 使用异步编程:对于涉及到I/O操作的大量数据处理,可以使用异步编程。通过异步方式可以使程序在等待I/O操作返回结果时不被阻塞,提高并发处理能力和效率。 总的来说,要高效处理大量数据,需要合理选择数据结构、使用并行处理和批量处理、延迟加载数据、使用合适的算法和优化技巧,并利用异步编程思想,以提高效率和性能。 ### 回答3: C#是一种支持面向对象编程和多线程处理的编程语言,它提供了许多工具和技术来高效处理大量数据。 首先,C#提供了强大的集合类和LINQ(Language Integrated Query)查询语言。我们可以使用List、Dictionary、HashSet等集合类来存储和处理大量的数据。同时,LINQ提供了一种简洁而直观的查询语法,可以快速筛选、排序和转换数据。通过结合使用集合类和LINQ,我们可以快速地对大量数据进行处理和分析。 其次,C#支持多线程编程。当处理大量数据时,我们可以使用多线程来并行处理数据,提高处理速度。通过使用Task、Parallel类和异步编程模型,我们可以同时处理多个数据块,而不必等待前一个数据块处理完毕。这种并发处理方式可以充分利用多核处理器的计算能力,提高数据处理的效率。 此外,C#还提供了一些高效的文件操作和网络通信的API。我们可以使用MemoryMappedFile类来直接在内存中读写大量数据,而不必频繁地进行磁盘IO操作。此外,使用Socket类或HttpClient类来进行网络数据传输时,可以采用异步的方式,提高数据传输的效率。 最后,C#提供了一些性能优化的技术和工具。我们可以使用性能分析器来找出程序中的性能瓶颈,并进行相应的优化。同时,我们可以使用缓存技术来避免重复的计算和读取操作,提高数据处理的效率。 综上所述,C#通过其强大的集合类、LINQ查询语言、多线程编程支持、高效的文件操作和网络通信API以及性能优化的技术,可以高效处理大量数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值