首页 > 系统相关 >关于内存泄漏和代码优化

关于内存泄漏和代码优化

时间:2024-04-16 11:23:03浏览次数:26  
标签:泄漏 exe 性能 代码优化 内存 使用 数据结构 数据

最近在用selenium对网页上的数据进行爬取时发现,通过pyinstaller打包成的.exe文件运行时速度越来越慢,通过查找任务管理器里的句柄数,发现可能存在内存泄漏的原因,记录一下关于内存泄漏的处理方法和代码优化

1. 内存泄漏
如果您怀疑代码可能存在内存泄漏,可以尝试跟踪内存分配:
这里我用的是tracemalloc模块下get_traced_memory()方法
自定义current,peak = get_traced_memory()
current:存储当前分配的内存大小,表示当前时刻程序分配内存大小
peak:存储了程序运行期间分配内存大小的峰值
· 关于内存泄漏的改进方法:
1. 使用with语句打开文件可以确保文件在操作完成后被正确关闭
2. 重用DateFrame
3. 异常处理:在可能出现异常的地方使用try-except块,确保异常发生时资源被释放

2. 代码优化

处理大量数据时,优化数据结构是提高程序性能的关键。以下是一些常见的数据结构优化方法:
1.使用适当的数据结构:
根据数据的访问模式选择合适的数据结构。例如,如果频繁进行插入和删除操作,可能更适合使用链表而不是数组。
对于需要快速查找、插入和删除操作的场景,哈希表(散列表)是一个很好的选择。
2. 减少数据结构的空间复杂度:
使用紧凑的数据结构,如位字段(bit fields)或压缩数据结构,以减少内存使用。
对于稀疏数据,使用稀疏数组或稀疏矩阵来节省空间。
3. 优化数据访问模式:
尽量减少缓存未命中的次数,例如,通过使用连续的内存块和避免随机访问。
对于频繁访问的数据,考虑使用缓存或缓冲区来提高访问速度。
4. 使用高效的数据结构实现:
使用经过优化的库,如numpy数组代替内置的Python列表,以提高数值计算的效率。
对于特定的应用场景,选择专门为性能设计的数据结构,如优先队列、跳表、平衡二叉搜索树等。
5. 减少数据拷贝和移动:
在处理大数据时,尽量避免不必要的数据拷贝。例如,使用切片而不是复制整个数据集。
使用原地(in-place)算法来减少内存分配和垃圾回收的开销。
6. 使用批处理和延迟处理:
批量处理数据可以减少函数调用的开销和管理数据结构的时间。
延迟处理(如懒惰计算)可以在需要时才处理数据,而不是预先处理所有数据。
7. 优化数据存储和检索:
对于需要频繁读取的数据,考虑使用索引来加快检索速度。
使用数据库或其他数据存储解决方案来优化大规模数据的存储和查询。
8. 并行处理:
使用多线程或多进程来并行处理数据,以利用多核处理器的性能。
使用并行算法和数据结构来提高处理速度,但要小心同步和资源竞争问题。
9. 内存映射文件:
对于非常大的数据集,使用内存映射文件(mmap)可以减少内存使用,并允许操作系统更有效地管理内存。
10. 算法优化:
分析算法的时间复杂度,并尝试使用更高效的算法。例如,使用快速排序而不是冒泡排序。

3. 将Python程序封装成.exe文件后,监控其性能可以通过以下几种方法:

1. 内置性能分析:
在Python代码中使用time模块来记录关键部分的执行时间。

使用cProfile或其他性能分析库来分析代码的运行效率,然后将其集成到你的应用程序中,使其在运行时能够输出性能数据。
2. 外部性能监控工具:
使用系统监控工具,如Windows的任务管理器或Resource Monitor来监控.exe文件的CPU、内存和磁盘使用情况。
使用专门的性能监控软件,如Microsoft Application Verifier、Performance Monitor (PerfMon)、AMD CodeAnalyst或Intel VTune Amplifier,这些工具可以提供更详细的性能数据。
3. 日志记录:
在.exe文件中集成日志记录功能,记录程序的运行状态、资源使用情况和错误信息。这可以通过Python的logging模块实现。
日志可以帮助你分析程序在不同阶段的性能表现,以及在出现问题时提供诊断信息。
4. API监控:
如果.exe文件提供了API接口,可以使用API测试工具来监控其对请求的响应时间和资源消耗。
5. 图形界面性能测试:
如果.exe文件是一个图形界面应用程序,可以使用UI自动化工具,如Selenium或PyAutoGUI,来模拟用户交互并测量响应时间。
6. 第三方库:
使用第三方库,如psutil,来从Python代码中获取系统资源使用情况,并将其记录到日志中或在运行时显示。
7. 分布式跟踪:
如果适用,可以使用分布式跟踪系统,如Zipkin或Jaeger,来监控微服务或分布式应用程序的性能。

标签:泄漏,exe,性能,代码优化,内存,使用,数据结构,数据
From: https://www.cnblogs.com/zjw-lxj/p/18137714

相关文章

  • C++动态内存分配/malloc/new
    0前言这部分确实是面试老八股了,不过我还是记录一下1内存分区在C语言中,将内存分为程序代码区+数据区,其中数据区又分为静态存储区和动态存储区在C++中,分为五种:动态存储区:栈区:存放局部变量,由编译器自动分配释放,程序员不能操作堆:由程序员使用malloc/new申请,用free/delete......
  • hive on spark内存模型
    内容介绍hiveonspark的调优,那必然涉及到这一系列框架的内存模型。本章就是来讲一下这些框架的内存模型。hiveonspark的任务,从开始到结束。总共涉及了3个框架。分别是:yarn、hive、spark其中,hive只是一个客户端的角色。就不涉及任务运行时的内存。所以这里主要讲的yarn和spa......
  • influxdb内存占用剖析
    目标本文将讲述influxdb内存中都存了哪些数据?什么情况下会导致内存占用暴增?以及内存相关的配置。我的influxdb配置我的influxdb配置如下:/etc/influxdb/config.tomlbolt-path="/var/lib/influxdb/influxd.bolt"engine-path="/var/lib/influxdb/engine"storage-cache-m......
  • C++_内存模型和函数以及类
    C++内存模型函数函数与编译器类成员变量class内部通过 static修饰变量时,表示该变量为静态成员变量,必须在类外定义 staticconst修饰变量时,表示该变量为静态成员常量,可以在类内初始化,或者在类外初始化 staticconstexpr修饰变量时,表示该......
  • C++对象封装后的内存布局
    在C语言中,数据和数据的处理操作(函数)是分开声明的,在语言层面并没有支持数据和函数的内在关联性,我们称之为过程式编程范式或者程序性编程范式。C++兼容了C语言,当然也支持这种编程范式。但C++更主要的特点在支持基于对象(object-based,OB)和面向对象(object-oriented,OO),OB和OO的基础是......
  • mongo内存管理之cache占用过高,影响正常业务
    云数据库DDS实例shard连接数异常激增影响业务的事件,问题分析如下保障现象:在当天22日21:50-22:21时间段内,连接数异常激增,同时伴随有大量慢日志,实例整体响应速度下降。3月23日19:35贵司报障该实例再次出现shard连接数激增的现象。排查处理:经过排查发现3月22日21:50-......
  • Go实践:用Sync.Map实现简易内存缓存系统
    介绍定义了一个Cache结构体,其中使用sync.Map作为底层数据结构来存储缓存项。Set方法用于设置缓存项,指定键、值以及过期时间。Get方法用于获取缓存项,如果缓存项存在且未过期,则返回值和true,否则返回nil和false。方法的接受者为指针类型,是为了对Cache对象进行操作,并在方法内部访问和......
  • [转帖]内存分析之GCViewer详细解读
    文章目录GCViewer详细解读一,Chart详解二,Eventdetail三,Summary四,Pause五,相关概念5.1GC5.1.1FullGC5.1.2MinorGC5.2垃圾收集器5.2.1串行收集器(Serial)5.2.2**ParNew收集器**5.2.3**ParallelScavenge**收集器**5.2.4CMS收集器(ConcurrentMarkSweep)****5.2.5G1......
  • C++ 解引用与函数基础:内存地址、调用方法及声明
    C++解引用获取内存地址和值在上一页的示例中,我们使用了指针变量来获取变量的内存地址(与引用运算符&一起使用)。但是,你也可以使用指针来获取变量的值,这可以通过使用*运算符(解引用运算符)来实现:stringfood="Pizza";//变量声明string*ptr=&food;//指针声明//引用......
  • SQL 执行大脚本 提示内存不足 解决办法
    SQL 执行大脚本 提示内存不足 解决办法 用微软自带的sqlcmd工具,可以导入执行。以SQL Server 2008R版本为例:第一步:Win+R 键入:cmd 命令,开启命令行工具;第二步:键入:cd C:\Program Files\Microsoft SQL Server\100\Tools\Binn (具体目录路径跟你安装的SQL位置有关)第三步:键入......