python 内存溢出的解决方法
发表于|更新于|码不能停
|总字数:331|阅读时长:1分钟|浏览量:
运行在服务器上的数据同步脚本突然出现已杀死,谁把你杀了,咋就突然被杀了???

系统日志
切换到 var/log/ 查看 messages,发现是 Out of memory: Kill process 13678 (python3) score 906 or sacrifice child
原因分析
这就奇怪了,数据同步脚本每次运行完都会释放内存的,而且已经从常开的死循环改成了 BlockingScheduler 的定时任务,按理说不应该消耗大量内存。
数据同步没问题,那就只能是其他程序消耗了,想起来这里不紧运行了数据同步,还有一个 laravel 项目和一个 django 项目,laravel 为 django 提供接口,问题很有可能就出现在 django!
运行 top 查看 python 的内存消耗,然后通过 laravel 调用一下接口,发现内存确实上涨并且一直没有释放。
罪魁祸首终于找到了!
问题解决
经过一番查询,django 引发内存泄漏一般有两种情况,一个是直接访问 django 的数据库接口时没有主动释放游标,另一个就是设置了 debug 模式,这个项目因为还在开发,所以 debug 模式确实开着。
改掉以后再试,果然内存不再飙升。
线上环境一定要慎重啊!
文章作者: m-finder
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 M-finder!
相关推荐

2019-04-18
卷积神经网络学习
卷积神经网络,计算机视觉应用几乎都在使用的一种深度学习模型。 一般用于训练数据集较小的问题,比如图像分类。 简介卷积神经网络是一种多层神经网络,主要由输入层,卷积层,激励函数,池化层和全连接层组成,可以通过一系列方法,成功将数据量庞大的图片识别问题不断降维,最终使其能够被训练。 输入层即数据的输入。 通过传入参数 input_shape=(28, 28, 1) 来设置网络接收张量的形状。 卷积层使用卷积核来进行特征提取和特征映射。 当我们输入的图像是 28 * 28 * 1 ,定义一个 3 * 3 的卷积核来对图像进行卷积操作(可以理解为一个滑动窗口,把卷积核与对应的图像像素做乘积然后求和),得到了 3 * 3 的卷积结果。 这个过程我们可以理解为我们使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。 激励层激励层主要对卷积层的输出进行一个非线性映射,因为卷积层的计算还是一种线性计算。 使用的激励函数一般是 ReLu。 卷积层和激励层一般合并在一起成为“卷积层”。 池化层其实就是下采样。一般在卷积层后边,通过池化来压缩卷积层输出的特征向量,使特征图变小,简化网络计算复杂度,同时改善结果。 全连接层在这里的作用由提取特征变成了分类。 实例化网络实例化一个简单的卷积神经网络模型。 1234567891011from keras import layersfrom keras import modelsmodel = models.Sequential()model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation='relu'))model.add(layers.MaxPooling2D((2, 2)))model.add(layers.Conv2D(64, (3, 3), activation='relu'))print(model.summary()) 运行结果如下: 123456789101112131415161718_________________________________________________________________Layer (type) Output Shape Param #=================================================================conv2d_1 (Conv2D) (None, 26, 26, 32) 320_________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 13, 13, 32) 0_________________________________________________________________conv2d_2 (Conv2D) (None, 11, 11, 64) 18496_________________________________________________________________max_pooling2d_2 (MaxPooling2 (None, 5, 5, 64) 0_________________________________________________________________conv2d_3 (Conv2D) (None, 3, 3, 64) 36928=================================================================Total params: 55,744Trainable params: 55,744Non-trainable params: 0_________________________________________________________________None 首先是网络层设置,这里是 5 层神经网络。 添加第一个卷积层,滤波器数量是 32,卷积窗口大小是 3 * 3,strides 指卷积沿高度和宽度的步幅,默认(1, 1),padding 是指卷积窗口滑动的方式,两个参数:默认 VALID 和 SAME,SAME 采用的是补全,即宽度不够时先补 0 再滑动,VALID 则直接丢弃多余的元素,激励函数选择 relu。因为是第一层,所以需要说明输入数据的 shape。 第一层 pooling(池化,下采样),将数据分辨率长宽各降低一半。 然后再继续添加,接下来把最后输出张量 (3, 3, 64)展平输入到一个全连接层。 添加全连接层分类器123model.add(layers.Flatten())model.add(layers.Dense(64, activation='relu'))model.add(layers.Dense(10, activation='softmax')) 继续打印,查看模型结构: 12345flatten_1 (Flatten) (None, 576) 0_________________________________________________________________dense_1 (Dense) (None, 64) 36928_________________________________________________________________dense_2 (Dense) (None, 10) 650 可以看到数据再丢入分类器之前被展平成了一维 (None, 576) 训练网络123456789101112131415161718from keras.datasets import mnistfrom keras.utils import to_categorical(train_images, train_labels), (test_images, test_labels) = mnist.load_data()train_images = train_images.reshape((60000, 28, 28, 1))train_images = train_images.astype('float32') / 255test_images = test_images.reshape((10000, 28, 28, 1))test_images = test_images.astype('float32') / 255train_labels = to_categorical(train_labels)test_labels = to_categorical(test_labels)model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])model.fit(train_images, train_labels, epochs=5, batch_size=64)test_loss, test_acc = model.evaluate(test_images, test_labels)print(test_acc) 先通过张量变形格式化数据, 然后配置学习过程,开始训练。 最后打印结果可以看到精度为 0.9913 ,比之前的神经网络精度高了很多。

2019-04-10
深度学习 -- 基于 keras 的手写数字识别示例
MNIST 是 keras 中一个入门级的计算机视觉数据集,这个数据集包含各种各样的手写数字图片,其中包含 60000 张训练图像和 10000 张测试图像。 是解决手写数字分类问题的经典数据集,可以看做是深度学习的 ‘Hello World’。 下载数据123from keras.datasets import mnist(train_images, train_labels), (test_images, test_labels) = mnist.load_data() 这两行代码需要先运行,下载数据集。 下载过程会失败,多试几次,不需要翻墙。 train_images 和 train_labels 为训练集, 分别为图片数据和标签数据。模型将从这些数据中进行学习。 然后在测试集: test_images 和 test_labels 上对模型进行测试。 构建网络12345from keras import modelsfrom keras import layersnetwork = models.Sequential()network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))network.add(layers.Dense(10, activation='softmax')) 神经网络的核心组件是层(layer),它是一种数据处理模块,可以将它看成数据过滤器。大多数深度学习都是将简单的层链接起来,从而实现渐进式的数据蒸馏(data distillation)。深度学习模型就像是数据处理的筛子,包含一系列越来越精细的数据过滤器(即层)。 编译123network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) loss: 损失函数,网络如何衡量在训练数据上的性能,即网络如何朝着正确的方向前进。optimizer: 优化器,基于训练数据和损失函数来更新网络的机制metrucs: 监控指标,本例只关心精度,即正确分类的图像所占的比例。 准备图像数据1234train_images = train_images.reshape((60000, 28 * 28))train_images = train_images.astype('float32') / 255test_images = test_images.reshape((10000, 28 * 28))test_images = test_images.astype('float32') / 255 开始之前,我们需要转换数据格式,让网络能够处理。训练图像保存在一个uint8类型的数组中,其形状为 (60000, 28, 28),取值区间为 [0, 255]。我们需要将其转换成一个 float32数组,形状为 (60000, 28 * 28),取值范围为 0 ~ 1。 准备标签123from keras.utils import to_categoricaltrain_labels = to_categorical(train_labels)test_labels = to_categorical(test_labels) 开始训练1network.fit(train_images, train_labels, epochs=5, batch_size=128) 测试数据12test_loss, test_acc = network.evaluate(test_images, test_labels)print('test_acc:', test_acc) 测试集精度为97.98%,比训练集精度低不少。 训练精度和测试精度之间的这种差距是过拟合(overfit)造成的。 这些东西接下来再继续学习。