Tuning ‘log file sync’ Event Waits
In this blog entry, I will discuss strategies and techniques to resolve ‘log file sync’ waits. This entry is intended to show an approach based upon scientific principles, not necessarily a step-by-step guide. Let’s understand how LGWR is inherent in implementing the commit mechanism first.
Commit Mechanism and LGWR Internals
At commit time, a process creates a redo record (containing commit opcodes) and copies that redo record into the log buffer. Then, that process signals LGWR to write the contents of log buffer. LGWR writes from the log buffer to the log file and signals user process back completing a commit. A commit is considered successful after the LGWR write is successful.
Of course, there are minor deviations from this general concept, such as latching, commits from a plsql block, or IMU-based commit generation, etc. But the general philosophy remains the same.
Signals, Semaphores and LGWR
The following section introduces the internal workings of commit and LGWR interation in Unix platforms. There are minor implementation differences between a few Unix flavours or platforms like NT/XP, for example the use of post-wait drivers instead of semaphores etc. This section will introduce, but not necessarily dive deep into, internals. I used truss
to trace LGWR and user process. The command is:
truss -rall -wall -fall -vall -d -o /tmp/truss.log -p 22459
(A word of caution: don’t truss LGWR or any background process unless it is absolutely necessary. Doing so can cause performance issues, or worse, shutdown the database.)
Initially, LGWR is sleeping on semaphore, using the semtimedop or semop call.
22459/1: semtimedop(9, 0xFFFFFD7FFFDFE648, 1, 0xFFFFFD7FFFDFE488) EAGAIN 22459/1: semnum=15 semop=-1 semflg=0 22459/1: timeout: 2.060000000 sec
In the above call, 9
is the semaphore set id visible through the ipcs command and semnum=15
is the semaphore for the LGWR process in that set.
The next argument is a structure sembuf:
{ unsigned short sem_num; /* semaphore number */ short sem_op; /* semaphore operation */ short sem_flg; /* operation flags */ }
The third argument is number of semaphores.
When a session commits, a redo record is created and copied in to the log buffer. Then that process posts an LGWR semaphore using a semctl
call if LGWR is not active already. Then, the process goes to sleep with a semtimedop
call in its own semaphore.
The semaphore set id is 9, but sem_num
is 118, which is for the user process I was tracing. The first semctl calls is posting LGWR. The process then sleeps on the semtimedop
call.
27396/1: semctl(9, 15, SETVAL, 1) = 0 ... 27396/1:semtimedop(9, 0xFFFFFD7FFFDFC128, 1, 0xFFFFFD7FFFDFBF68)=0 27396/1: semnum=118 semop=-1 semflg=0 27396/1: timeout: 1.000000000 sec
The waiting log writer gets a 0
return code from semtimedop
and writes the redo records to the current redo log file. kaio
calls are kernalized asynchronous I/O calls on the Solaris platform.
22459/7: pwrite(262, "01 "9E0E i ?".., 1024, 1915904) = 1024 22459/9: pwrite(263, "01 "9E0E i ?".., 1024, 1915904) = 1024 22459/1: kaio(AIOWAIT, 0xFFFFFD7FFFDFE310) = 1 22459/1: timeout: 600.000000 sec 22459/9: kaio(AIONOTIFY, 0) = 0 22459/7: kaio(AIONOTIFY, 0) = 0
After successful completion of the write(s), LGWR posts a semaphore of the waiting process using the semctl
command.
22459/1: semctl(9, 15, SETVAL, 1) = 0
The user process/session continues after receiving a return code from semtimedop
call, reprinted below.
27396/1:semtimedop(9,0xFFFFFD7FFFDFC128,1,0xFFFFFD7FFFDFBF68)=0
So, What Exactly is a ‘log file sync’ wait?
A commit is not complete until LGWR writes the log buffers, including the commit redo records to the log files. In a nutshell, after posting LGWR to write, user or background processes wait for LGWR to signal back with a 1-second timeout. The User process charges this wait time as a ‘log file sync’ event.
In the prior section, ‘log file sync’ waits start at step 2 after the semctl
call, and completes after step 5.
The Root Causes of ‘log file sync’ waits
The root causes of ‘log file sync’ essentially boil down to few scenarios. The following is not an exhaustive list, by any means.
- LGWR is unable to complete writes fast enough for one of the following reasons:
- Disk I/O performance to log files is not good enough. Even though LGWR can use asynchronous I/O, redo log files are opened with the
DSYNC
flag and buffers must be flushed to the disk (or at least, written to the disk array cache in the case of SAN) before LGWR can mark a commit as complete. - LGWR is starving for CPU resource. If the server is very busy, LGWR can starve for CPU too. This will lead to slower response from LGWR, increasing ‘log file sync’ waits. After all, these system calls and I/O calls must use CPU. In this case, ‘log file sync’ is a secondary symptom and resolving the root cause for high CPU usage will reduce ‘log file sync’ waits.
- Due to memory starvation issues, LGWR can be paged out. This also can lead to slower response from LGWR.
- LGWR is unable to complete writes fast enough due to file system or uUnix buffer cache limitations.
- Disk I/O performance to log files is not good enough. Even though LGWR can use asynchronous I/O, redo log files are opened with the
- LGWR is unable to post the processes fast enough, due to excessive commits. It is quite possible that there is no starvation for CPU or memory, and that I/O performance is decent enough. Still, if there are excessive commits, LGWR has to perform many writes/
semctl
calls, and this can increase ‘log file sync’ waits. This can also result in sharp increase in redo wastage statistics. - IMU undo/redo threads. With private strands, a process can generate few Megabytes of redo before committing. LGWR must write the generated redo so far, and processes must wait for ‘log file sync’ waits, even if the redo generated from other processes is small enough.
- LGWR is suffering from other database contention such as enqueue waits or latch contention. For example, I have seen LGWR freeze due to CF enqueue contention. This is a possible scenario, albeit an unlikely one.
- Various bugs. Oh yes, there are bugs introducing unnecessary ‘log file sync’ waits.
It is worthwhile to understand and identify the root cause, to and resolve it. Here are the steps and considerations.
1. First make sure the ‘log file sync’ event is indeed a major wait event. For example, in the statspack report for 60 minutes below, ‘log file sync’ is indeed an issue. Why? Statspack runs for 1800 seconds and there are 8 CPUs in the server, so there are roughly 14,400 CPU seconds available. There is just one database alone in this server, and so, the approximate CPU usage is 7034/14,400: 50%
But, 27021 seconds were spent waiting. On average, 27021/3600 = 7.5
processes were waiting for ‘log file sync’ event. So, this is a major bottleneck for application scalability.
Top 5 Timed Events ~~~~~~~~~~~~~~~~~~ % Total Event Waits Time (s) Ela Time --------------------------- ------------ -------- -------- log file sync 1,350,499 27,021 50.04 db file sequential read 1,299,154 13,633 25.25 CPU time 7,034 13.03 io done 3,487,217 3,225 5.97 latch free 115,471 1,325 2.45
2. Next, identify and break down LGWR wait events, and query wait events for LGWR. In this instance, the LGWR sid is 3 (and usually it is).
select sid, event, time_waited, time_waited_micro from v$session_event where sid=3 order by 3 SQL> / SID EVENT TIME_WAITED TIME_WAITED_MICRO ------ ------------------------------ ----------- ----------------- .. 3 control file sequential read 237848 2378480750 3 enqueue 417032 4170323279 3 control file parallel write 706539 7065393146 3 log file parallel write 768628 7686282956 3 io done 40822748 4.0823E+11 3 rdbms ipc message 208478598 2.0848E+12
When LGWR is waiting (using the semtimedop
call) for posts from the user sessions, that wait time is accounted as an ‘rdbms ipc message’ event. Normally, this event can be ignored. The next highest waited event is the ‘io done’ event. After submitting async I/O requests, LGWR waits until the I/O calls complete, since LGWR writes are done as synchronous writes. (“asynchronous” and “synchronous” are not contradictory terms when comes to I/O. Google it — there is enormous information about this already.)
It is worth noting that v$session_event
is a cumulative counter from the instance startup, and hence, can be misleading. The difference between two snapshots from this view, for the same session, can be quite useful.
Tanel Poder has written an excellent tool for this. Using that tool, we can print out a 1-second snapshot for LGWR session 3. From the table below, 813 milliseconds were spent waiting for ‘io done’ event in a 1-second interval. That’s 81%. (Some parts of the output have been removed to improve readability.)
------------------------------------------------------------------ SID, SNAPSHOT START ,SEC, TYPE, STATISTIC , DELTA, ------------------------------------------------------------------ 3, 20080513 11:44:32, 1, STAT, messages sent , 9, 3, 20080513 11:44:32, 1, STAT, messages received , 153, 3, 20080513 11:44:32, 1, STAT, redo wastage , 39648, 3, 20080513 11:44:32, 1, STAT, redo writes , 152, 3, 20080513 11:44:32, 1, STAT, redo blocks written , 1892, 3, 20080513 11:44:32, 1, STAT, redo write time , 82, 3, 20080513 11:44:32, 1, WAIT, rdbms ipc message , 169504, 3, 20080513 11:44:32, 1, WAIT, io done , 813238, 3, 20080513 11:44:32, 1, WAIT, log file parallel write , 5421, 3, 20080513 11:44:32, 1, WAIT, LGWR wait for redo copy , 1,
3. Next, confirm that LGWR is waiting for that event by SQL*Trace also. Tracing LGWR can deteriorate performance further. So, careful consideration must be given before turning sqltrace on LGWR. Packages such as dbms_system/dbms_support or oradebug can be used to turn on a 10046 event at level 12.
A few trace lines are shown below. In this specific case, LGWR is waiting for I/O events. The output below shows that LGWR submitted two write calls with 16 redo blocks. Waits for I/O completion events are counted as ‘io done’ events. Between two calls, LGWR waited for 1600 microseconds or 1.6ms. The performance of write itself is not entirely bad.
WAIT #0: nam='rdbms ipc message' ela= 7604 p1=223 p2=0 p3=0 WAIT #0: nam='log file parallel write' ela= 35 p1=2 p2=16 p3=2 WAIT #0: nam='io done' ela= 0 p1=0 p2=0 p3=0 WAIT #0: nam='io done' ela= 639 p1=0 p2=0 p3=0 WAIT #0: nam='io done' ela= 0 p1=0 p2=0 p3=0 WAIT #0: nam='io done' ela= 605 p1=0 p2=0 p3=0 WAIT #0: nam='io done' ela= 1 p1=0 p2=0 p3=0 WAIT #0: nam='io done' ela= 366 p1=0 p2=0 p3=0
4. Let’s look at few other statistics also. From the statspack report, and with one column removed to improve readability:
Statistic Total per Second ------------------------------- ----------- -------------- redo blocks written 230,881 2,998.5 redo buffer allocation retries 0 0.0 redo entries 285,803 3,711.7 redo log space requests 0 0.0 redo log space wait time 0 0.0 redo ordering marks 0 0.0 redo size 109,737,304 1,425,159.8 redo synch time 40,744 529.1 redo synch writes 38,141 495.3 redo wastage 5,159,124 67,001.6 redo write time 6,226 80.9 redo writer latching time 4 0.1 user calls 433,717 5,632.7 user commits 38,135 495.3 user rollbacks 1 0.0 workarea executions - multipass 0 0.0
From the above statistics, we can see that
- 5632 user calls / second were made and 495 commits
were executed per second, on average. - 3000 redo blocks (of size 512 bytes in solaris) are written by LGWR, approximately 1.5MB/sec.
- 1.4MB/sec redo was generated, which is approximately 16Mbps.
- For 3000 redo blocks, 38,155 commits were created.
Essentially, the redo size is high, but not abnormal. But, 500 commits per second is on the higher side.
5. Knowledge about your application will be useful here. If commit frequency is higher, trace a few sessions and understand why there are so many commits. For example, in the following trace file, there is a commit after every SQL statement, and that can be the root cause for these waits.
The XCTEND
call below with rlbk=0
and rd_only=0
is a commit.
WAIT #120: nam='SQL*Net message from client' ela= 291 p1=1952673792 p2=1 p3=0 XCTEND rlbk=0, rd_only=0 WAIT #0: nam='log file sync' ela= 1331 p1=31455 p2=0 p3=0 WAIT #0: nam='SQL*Net message to client' ela= 1 p1=1952673792 p2=1 p3=0
6. Next, examine the commit frequency. If it is higher, LGWR could be spending time signalling user process. Just as with any other process, the Unix scheduler can kick LGWR off the CPU, and this can cause foreground processes to wait for ‘log file sync’ event. In Solaris, prstat microstat
accounting (-mL
) is quite useful in breaking down how much time is spent by LGWR waiting for CPU.
7. Although uncommon, there are few bugs causing unnecessary ‘log file sync’ waits, signaling incorrect processes etc.
8. In a few scenarios, ‘log file sync’ waits are intermittent and hard to catch. Statistics might need to be captured with more granularity to understand the issue. In the example below, I had instance freeze intermittently, and I wrote a small script to gather statistics from v$sysstat
every 20 seconds and spool to a file. Also, we were collecting iostat
using the Oracle-supplied tool, LTOM.
23-MAR-2007-04:29:43:Redo blocks written:1564176614:Delta: 8253 23-MAR-2007-04:30:14:Redo blocks written:1564176614:Delta: 0 23-MAR-2007-04:30:44:Redo blocks written:1564205771:Delta:29157
Between 4:29:43 and 4:30:14, redo blocks-written statistics did not change, since delta is 0. Meaning, LGWR did not write any redo blocks. But, ‘redo size’ statistics during the same duration was at ~7MB in that instance. The number of processes waiting for the ‘log file sync’ event increased to 100. So, we know that freeze occurred because LGWR wasn’t able to write any blocks during this time-frame.
In a RAC cluster, this problem is magnified, since both CR- and CUR-mode buffers need the log flush to complete before these blocks can be transferred to another instance’s cache.
Looking closely at I/O statistics, we can see that average service time was quite high for a few devices during that time period (we mapped these devices back to log file systems later). This lead to more a granular time-frame, and finally, the issue proved to be a hardware switch intermittently freezing.
extended device statistics r/s w/s kr/s kw/s wait actv wsvc_t asvc_t %w %b device 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0 100 d6 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0 100 d2 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0 100 d1 0.0 0.0 0.0 0.0 0.0 9.0 0.0 0.0 0 100 d0 0.0 0.0 0.0 0.0 0.0 3.0 0.0 0.0 0 100 d13 0.0 2.0 0.0 24.0 0.0 2.0 0.0 1000.7 0 100 d12 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0 100 d11
9. Unix tools such as truss
, tusc
, and strace
can be used to debug those scenarios if the above techniques are not sufficient. But, tools such as truss
and strace
should be used as a last resort. In Solaris 10, dtrace
can be used to debug I/O or processor-specific issues. dtrace
is safer by design. Brendan Gregg has a dtrace tool kit and wealth of information here.
Guidelines for Resolving a Few Root Causes
Finding and understanding the root cause is essential to resolving a performance issue. Some final observations:
- If I/O bandwith is an issue, then doing anything other than improving I/O bandwidth is not useful. Switching to file systems providing better write throughput is one option. RAW devices are another option. Reducing the number of log file members in a group is another, as it reduces the number of write calls. But, this option comes with a cost.
- If CPU starvation is an issue, then reducing CPU starvation is the correct step to resolve it. Increasing the priority of LGWR is a work around.
- If commit rate is higher, then decreasing commits is correct step but, in a few cases, if that is not possible, increasing the priority of LGWR (using
nice
) or increasing the priority class of LGWR to RT might provide some relief. - Solid State Disk devices also can be used if the redo size is extreme. That being thecase, it is also preferable to decrease redo size.
- If excessive redo size is the root cause, it can be reduced using various techniques. More information can be found here (PDF).
In summary, finding and resolving the root cause for a log file sync event will improve application response time.
参考至:https://www.pythian.com/blog/tuning-log-file-sync-event-waits/
如有错误,欢迎指正
邮箱:czmcj@163.com
相关推荐
在数据库管理中,"log file sync"事件等待是一个关键的问题,它涉及到数据库日志文件同步的过程。"log file sync"事件表示事务提交时,用户进程需要等待LGWR(Log Writer)进程将重做日志缓冲区中的数据写入到重做...
在全球建筑行业不断追求节能与智能化发展的浪潮中,变风量(VAV)系统市场正展现出蓬勃的发展潜力。根据 QYResearch 报告出版商的深入调研统计,预计到 2031 年,全球变风量(VAV)系统市场销售额将飙升至 1241.3 亿元,在 2025 年至 2031 年期间,年复合增长率(CAGR)为 5.8%。这一令人瞩目的数据,不仅彰显了 VAV 系统在当今建筑领域的重要地位,更预示着其未来广阔的市场前景。 变风量系统的起源可追溯到 20 世纪 60 年代的美国。它犹如建筑空调系统中的 “智能管家”,能够敏锐地感知室内负荷或室内所需参数的变化,通过维持恒定的送风温度,自动、精准地调节空调系统的送风量,从而确保室内各项参数始终满足空调系统的严格要求。从系统构成来看,变风量系统主要由四个基本部分协同运作。变风量末端设备,包括 VAV 箱和室温控制器,如同系统的 “神经末梢”,负责接收室内环境变化的信号并做出初步响应;空气处理及输送设备则承担着对空气进行净化、加热、冷却等处理以及高效输送的重任;风管系统,涵盖新风、排风、送风、回风等管道,构建起了空气流通的 “高速公路”;而自动控制系统宛
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
内容概要:本文探讨了ChatGPT这种高级语音模式的人工智能聊天机器人与用户的互动对其情绪健康的影响。研究采用了两种互补的方法:大规模平台数据分析和随机对照试验(RCT)。平台数据部分通过对超过400万次对话进行隐私保护的大规模自动化分析以及对4000多名用户的调查,揭示了高频率使用者表现出更多的情感依赖和较低的社会交往意愿。RCT部分则通过近1000名参与者为期28天的研究,发现语音模型相较于文本模型能带来更好的情绪健康效果,但长时间使用可能导致负面后果。此外,初始情绪状态较差的用户在使用更具吸引力的语音模型时,情绪有所改善。 适合人群:对人机交互、情感计算和社会心理学感兴趣的科研人员和技术开发者。 使用场景及目标:本研究旨在为AI聊天机器人的设计提供指导,确保它们不仅能满足任务需求,还能促进用户的心理健康。同时,也为政策制定者提供了关于AI伦理使用的思考。 其他说明:研究强调了长期使用AI聊天机器人可能带来的复杂心理效应,特别是对于那些已经感到孤独或社交孤立的人来说,过度依赖可能会加剧这些问题。未来的研究应该更加关注这些极端情况下的用户体验。
Java 反射(Reflection)是一种强大的机制,允许程序在运行时检查和操作类的成员变量和方法。然而,传统的 `setAccessible(true)` 方式虽然便捷,但存在安全性问题,并且性能相对较低。在 Java 7 引入 `MethodHandle` 后,我们可以通过 `MethodHandles.Lookup.findVirtual()` 提供更优雅、高效的方式来访问对象属性。本文将对比这两种反射方式,并分析它们的优缺点。
loongdomShop.tar.gz
内容概要:本文探讨了不同交互模式(文本、中性语音、吸引人语音)和对话类型(开放式、非个人化、个人化)对聊天机器人使用者的心理社会效果(如孤独感、社交互动、情感依赖、不当使用)的影响。研究表明,在初期阶段,语音型聊天机器人比文本型更能缓解孤独感并减少情感依赖,但随着每日使用时间增加,这种优势逐渐消失,尤其是对于中性语音聊天机器人。此外,个人话题对话略微增加了孤独感,而非个人话题则导致更高的情感依赖。总体而言,高频率使用聊天机器人的用户表现出更多的孤独感、情感依赖和不当使用,同时减少了真实人际交往。研究还发现,某些个体特征(如依恋倾向、情绪回避)使用户更容易受到负面影响。 适合人群:心理学家、社会学家、人工智能研究人员以及关注心理健康和人机交互的专业人士。 使用场景及目标:①帮助理解不同类型聊天机器人对用户心理健康的潜在影响;②为设计更健康的人工智能系统提供指导;③制定政策和规范,确保聊天机器人的安全和有效使用。 其他说明:研究强调了进一步探索聊天机器人管理情感内容而不引发依赖或替代人际关系的重要性,呼吁更多跨学科的研究来评估长期影响。
MP4575GF-Z MP4575 TSSOP-20 降压型可调DC-DC电源芯片
界面设计_SwiftUI_习惯养成_项目管理_1742850611.zip
免安装版的logic软件包。支持波形实时查看。内含驱动文件。
1. **系统名称**:学生毕业离校系统 2. **技术栈**:Java技术、MySQL数据库、Spring Boot框架、B/S架构、Tomcat服务器、Eclipse开发环境 3. **系统功能**: - **管理员功能**:首页、个人中心、学生管理、教师管理、离校信息管理、费用结算管理、论文审核管理、管理员管理、留言板管理、系统管理。 - **学生功能**:首页、个人中心、费用结算管理、论文审核管理、我的收藏管理。 - **教师功能**:首页、个人中心、学生管理、离校信息管理、费用结算管理、论文审核管理。
配套文章:https://blog.csdn.net/gust2013/article/details/139608432
蓝凌OA系统V15.0管理员手册
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
mips-gcc520-glibc222编译工具链.zip
app开发
内容概要:本文档详细介绍了Swift编程语言的基础知识,涵盖语言特点、基础语法、集合类型、控制流、函数定义、面向对象编程、可选类型、错误处理、协议与扩展以及内存管理等方面的内容。此外还简要提及了Swift与UIKit/SwiftUI的关系,并提供了进一步学习的资源推荐。通过这份文档,读者可以全面了解Swift的基本概念及其在iOS/macOS/watchOS/tvOS平台的应用开发中的使用方法。 适合人群:初学者或者希望从其他编程语言转向Swift的开发者。 使用场景及目标:帮助读者快速上手Swift编程,掌握其基本语法和特性,能够独立完成简单的程序编写任务,为进一步学习高级主题如并发编程、图形界面设计打下坚实的基础。 阅读建议:由于Swift是一门现代化的语言,拥有许多独特的特性和最佳实践方式,在学习过程中应当多加练习并尝试理解背后的原理。同时利用提供的官方文档和其他辅助材料加深印象。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。