python Memory Error的解决方法

  在用python处理数据处理的时候有时候会碰到较大的数据集,可能会出现Memory Error 的问题,经过我的尝试,总结了如下几个方案。

1.回收一些暂时不用的内存

  首先扩展一下python查看内存的方法:

import psutil
import os
info = psutil.virtual_memory()
print('内存使用:',psutil.Process(os.getpid()).memory_info().rss)
print('总内存:',info.total)
print('内存占比:',info.percent)
print('CPU个数:',psutil.cpu_count())

输出:

内存使用: 1083351040
总内存: 17074249728
内存占比: 24.1
CPU个数: 4

  python的psutil包可以查看内存的使用情况,直接点任务管理器也可以查看电脑的内存使用占比,还可以kill掉一些不用的进程来释放内存。但是如果想要释放掉python占用的内存,比如一些使用过后续又不再需要的数据,可以导入gc包直接删除掉数据并回收内存。

import gc
del user_log
gc.collect()

输出:

19037

2. 修改数据类型的长度

  修改数据类型的长度,可以对数据进行内存压缩,从而减少内存的占用。

import time
# 对数据进行内存压缩
def reduce_mem_usage(df):
    starttime = time.time()
    numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']
    start_mem = df.memory_usage().sum() / 1024**2
    
    for col in df.columns:
        col_type = df[col].dtypes
        if col_type in numerics:
            c_min = df[col].min()
            c_max = df[col].max()
            if pd.isnull(c_min) or pd.isnull(c_max):
                continue
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    df[col] = df[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    df[col] = df[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    df[col] = df[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    df[col] = df[col].astype(np.int64)
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    df[col] = df[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    df[col] = df[col].astype(np.float32)
                else:
                    df[col] = df[col].astype(np.float64)
    end_mem = df.memory_usage().sum() / 1024**2
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100*(start_mem-end_mem)/start_mem))
        
    return df

3. 分而治之

  读文件的时候可以逐行读取或者分块读取,避免一次性把数据都读入到内存里,导致程序崩掉。

  • 逐行读取:
data = []
with open(path, 'r',encoding='gbk',errors='ignore') as f:
    for line in f:
        data.append(line.split(','))
  • 分块读取
      有时候即使可以一次性读取所有数据,但是对数据进行操作时(比如reduce_mem_usage),也可能跑不起来,这时候可以分块处理,再把结果拼接起来。
user_log_file = r'./file.csv'
read_chunks = pd.read_csv(user_log_file,iterator=True,chunksize=500000)
user_log = pd.DataFrame()
for chunk in read_chunks:
    chunk = reduce_mem_usage(chunk)
    user_log = user_log.append(chunk)

4. 修改磁盘虚拟内存

扩大磁盘虚拟内存:
1、打开 控制面板
2、找到 系统 这一项;
3、找到 高级系统设置 这一项;
4、点击 性能 模块的 设置 按钮;
5、选择 高级,在 虚拟内存 模块点击更改
6、选择一个你文件运行的磁盘,点击自定义大小
记得 不要 选中“自动管理所有驱动器的分页文件大小”,手动输入初始大小和最大值,当然,最好不要太大,更改之后能在查看盘的使用情况,不要丢掉太多空间。
7、都设置好之后,记得点击 “设置”, 然后再确定,否则无效,最后 重启电脑 就可以了。(一开始我没有重启电脑,还是跑不动,一度怀疑自己的硬件问题。)

  如果还有其他方法可以解决内存问题,欢迎留言交流~

### 回答1: Python中的MemoryError错误通常表示程序尝试使用超过可用内存的数据量。为了解决这个问题,有以下一些建议: 1. 优化代码:检查代码中是否存在不必要的数据结构或不必要的变量,尽量减少程序占用的内存量。 2. 增加可用内存:可以尝试升级硬件(例如增加内存),或者使用其他机器具有更多内存。 3. 减少数据量:可以通过增加程序中的批处理大小,减小数据规模,或使用增量计算的方式来减少单次处理的数据量。 4. 使用生成器或迭代器:使用生成器或迭代器可以在程序运行时节省内存,因为它们不会一次性加载所有数据。 5. 使用内存映射文件:内存映射文件可以将大型文件映射到虚拟内存中,从而减少程序所需的内存量。 6. 使用第三方库:有一些专门针对内存优化的第三方库,例如numpy、pandas等,可以尝试使用它们来优化程序的内存占用。 ### 回答2: Python中的MemoryError是一种由于内存不足而引起的错误,通常是由于程序中存在过多的内存占用或者是程序实现问题引起的。 对于Python MemoryError,有以下几种解决方法: 1. 使用生成器而非列表: 使用生成器可以大大减少程序中对于内存的需求。例如,如果需要遍历一个极大的数据集,使用生成器可以逐个返回每个数据点,而不需要一次性将所有数据点存储到内存里。 2. 使用迭代器而非列表: 与生成器类似,使用迭代器可以逐个处理数据点而不需要一次性将其全部读入内存。 3. 使用numpy数组存储数据: numpy提供了一种高效的方式来存储和处理大量数据。 4. 增加内存: 如果以上方法无法满足需求,可以增加计算机的物理内存。 5. 删除不需要的对象: 程序在执行过程中,会有许多不必要的对象被存储在内存中,如果及时删除这些对象,可以释放更多的内存空间。 6. 减少冗余: 在程序设计时,应避免出现冗余,尽量减少内存占用。比如,应避免存储重复的数据、重复计算等情况。 总之,针对Python MemoryError,有很多解决方法,可以根据实际情况选择适合自己的方法。同时,在程序开发中应注意减少内存占用,避免出现内存不足的情况。 ### 回答3: Python是一个高级编程语言,它受到了开发人员的欢迎,但是在处理大量数据时,会遇到Python MemoryError的问题,这个问题指的是python程序在执行期间无法分配足够的内存空间,导致程序崩溃。如果您遇到了Python MemoryError的问题,以下是一些解决办法: 1. 优化代码:如果您的代码超过了计算机的容量,那么您需要优化您的代码。优化代码包括使用生成器代替列表,使用迭代代替递归,使用离线模型训练等。 2. 减少内存使用:检查您的代码中是否有无用的变量、未关闭的文件句柄等。同时,还可以使用python内置的gc模块强制开启垃圾回收机制,以减少内存使用。 3. 增加可用内存:如果您的计算机配置足够好,可以增加计算机的物理内存或交换空间。同时,您还可以使用虚拟机或者docker容器等技术,将Python程序运行在其他的机器上。 4. 使用数据存储文件:如果您的数据量非常大,可以将数据存储在数据库或者文件中,而不是将所有数据读入内存。 5. 使用外部库:Python本身无法处理大数据集,但是您可以使用外部库,如Pandas、Dask等,来处理大数据集。这些库可以将数据分块,并使用延迟计算等技术来缓解Python MemoryError的问题。 总之,Python MemoryError是一个常见的问题,但是有很多解决办法。您可以优化代码、减少内存使用、增加可用内存、使用数据存储文件或者使用外部库来缓解Python MemoryError的问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值