TakcC / PHP-EPG-Docker-Server

用 php 实现的 EPG 服务端, Docker🐳 部署,带设置界面,支持 DIYP & 百川 、 超级直播 以及 xmltv 格式。
https://hub.docker.com/r/taksss/php-epg/
GNU General Public License v2.0
82 stars 27 forks source link

手动更新数据库时内存占用过大 #10

Closed phoenixxie0 closed 2 weeks ago

phoenixxie0 commented 4 weeks ago

在UNRAID上手动设置了-m 384M限制内存使用,但是手动更新数据库的时候,会导致内存占用过大,然后会导致更新失败。 image 如果不用-m设置内存限制,能更新成功,但是写入数据库瞬间,可能会超过512M的内存。

phoenixxie0 commented 4 weeks ago

image 限制为512M,依然占用满,且更新失败. image 限制为768M,依然占用满,且更新失败. 直到把内存设置到960M才能更新成功。

TakcC commented 4 weeks ago

能提供一下epg源,我测试一下吗?我之前是分batch插入的,后面改回来了。

phoenixxie0 commented 4 weeks ago

https://raw.githubusercontent.com/sparkssssssssss/epg/main/pp.xml https://gitee.com/Black_crow/xmlgz/raw/master/e.xml http://epg.51zmt.top:8000/e.xml 三个源

TakcC commented 4 weeks ago

奇怪,我用的也是你这三个源,倒是一切正常,而且我的还是2G渣渣主机。 而且你这个erw源还不是7天回放,按道理不怎么占用内存吧。 不知道是不是 gitee 限制访问 xml 文件,导致程序异常了,建议用 e.xml.gz ,现在还不会限制。 我还是改回之前分批插入了,换了一种实现,之前觉得实现得太不优雅,就给删除了。

过两天更新,到时候你再帮忙测试一下。我这边没UNRAID设备。

phoenixxie0 commented 4 weeks ago

我看了后台的进程,现在的实现方式好像是并发执行。我现在一个个源来测试,是哪个发生了问题,看看情况先. 三条源,每一个都单独进行了测试,如果设置了内存限制256M,都会卡死。

TakcC commented 3 weeks ago

更新分批插入了,你试试还会不会报错。

phoenixxie0 commented 3 weeks ago

设置128M内存无法更新,设置192M内存OK。

phoenixxie0 commented 3 weeks ago

但是现在又出现无法保存配置的情况,更新docker之后,配置无法保存了,是否更换了配置保存的文件

TakcC commented 3 weeks ago

是的,新版本改用 config.json 来存配置文件了。 内存这个,你可以尝试修改 update.php 第 252 行 if (count($currentChannelProgrammes) >= 50),看看改小一点能不能降低内存占用。 不过我猜是后面生成 xml 文件的时候内存占用比较高,因为最后还是要读进来才能生成 .xml.gz 文件,没办法分批。

mxdabc commented 3 weeks ago

亲测是PHP脚本导入SQLite时转码和导入时间过长,我在Arm平台上测试需要峰值600MB内存,amd64平台需要300~400MB不等,且SQLite仓库不支持高并发,我的那个仓库mxd's EPG的代码就是基于老张的改的,他原版就是SQLite数据库,api那边请求一高就锁库,所以我才改为MySQL+Redis

以下是个AI的答复,仅供参考,比我测试的数据还要离谱些


如果需要一个粗略的最大值估算,考虑到可能的缓存、批量操作和PHP脚本的开销,可能需要预备高达500MB到1GB的内存。然而,这个数字需要根据实际情况进行测试和调整。如果需要更精确的内存使用估算,可以在PHP脚本中使用memory_get_usage()函数来监测内存使用情况,并根据测试结果进行优化 。

TakcC commented 3 weeks ago

亲测是PHP脚本导入SQLite时转码和导入时间过长,我在Arm平台上测试需要峰值600MB内存,amd64平台需要300~400MB不等,且SQLite仓库不支持高并发,我的那个仓库mxd's EPG的代码就是基于老张的改的,他原版就是SQLite数据库,api那边请求一高就锁库,所以我才改为MySQL+Redis

以下是个AI的答复,仅供参考,比我测试的数据还要离谱些

如果需要一个粗略的最大值估算,考虑到可能的缓存、批量操作和PHP脚本的开销,可能需要预备高达500MB到1GB的内存。然而,这个数字需要根据实际情况进行测试和调整。如果需要更精确的内存使用估算,可以在PHP脚本中使用memory_get_usage()函数来监测内存使用情况,并根据测试结果进行优化 。

奇怪,我这边也测试过,在 armamd64 平台上,这几个源最大消耗内存都是 100~200M。 SQLite 的话,可能因为我这边只有几个朋友在用,2G4M 的小水管也绰绰有余了。 如果像你这样,打算提供给大家用,还是得 MySQL + Redis

phoenixxie0 commented 3 weeks ago

亲测是PHP脚本导入SQLite时转码和导入时间过长,我在Arm平台上测试需要峰值600MB内存,amd64平台需要300~400MB不等,且SQLite仓库不支持高并发,我的那个仓库mxd's EPG的代码就是基于老张的改的,他原版就是SQLite数据库,api那边请求一高就锁库,所以我才改为MySQL+Redis。 以下是个AI的答复,仅供参考,比我测试的数据还要离谱些 如果需要一个粗略的最大值估算,考虑到可能的缓存、批量操作和PHP脚本的开销,可能需要预备高达500MB到1GB的内存。然而,这个数字需要根据实际情况进行测试和调整。如果需要更精确的内存使用估算,可以在PHP脚本中使用memory_get_usage()函数来监测内存使用情况,并根据测试结果进行优化 。

奇怪,我这边也测试过,在 armamd64 平台上,这几个源最大消耗内存都是 100~200M。 SQLite 的话,可能因为我这边只有几个朋友在用,2G4M 的小水管也绰绰有余了。 如果像你这样,打算提供给大家用,还是得 MySQL + Redis

如果你的主机设置有swap,那么docker会使用它,导致内存估计并不准确

mxdabc commented 3 weeks ago

亲测是PHP脚本导入SQLite时转码和导入时间过长,我在Arm平台上测试需要峰值600MB内存,amd64平台需要300~400MB不等,且SQLite仓库不支持高并发,我的那个仓库mxd's EPG的代码就是基于老张的改的,他原版就是SQLite数据库,api那边请求一高就锁库,所以我才改为MySQL+Redis。 以下是个AI的答复,仅供参考,比我测试的数据还要离谱些 如果需要一个粗略的最大值估算,考虑到可能的缓存、批量操作和PHP脚本的开销,可能需要预备高达500MB到1GB的内存。然而,这个数字需要根据实际情况进行测试和调整。如果需要更精确的内存使用估算,可以在PHP脚本中使用memory_get_usage()函数来监测内存使用情况,并根据测试结果进行优化 。

奇怪,我这边也测试过,在 armamd64 平台上,这几个源最大消耗内存都是 100~200M。 SQLite 的话,可能因为我这边只有几个朋友在用,2G4M 的小水管也绰绰有余了。 如果像你这样,打算提供给大家用,还是得 MySQL + Redis

如果你的主机设置有swap,那么docker会使用它,导致内存估计并不准确

我没有设置swap哎

TakcC commented 3 weeks ago

亲测是PHP脚本导入SQLite时转码和导入时间过长,我在Arm平台上测试需要峰值600MB内存,amd64平台需要300~400MB不等,且SQLite仓库不支持高并发,我的那个仓库mxd's EPG的代码就是基于老张的改的,他原版就是SQLite数据库,api那边请求一高就锁库,所以我才改为MySQL+Redis

以下是个AI的答复,仅供参考,比我测试的数据还要离谱些

如果需要一个粗略的最大值估算,考虑到可能的缓存、批量操作和PHP脚本的开销,可能需要预备高达500MB到1GB的内存。然而,这个数字需要根据实际情况进行测试和调整。如果需要更精确的内存使用估算,可以在PHP脚本中使用memory_get_usage()函数来监测内存使用情况,并根据测试结果进行优化 。

今天测试了,主要内存开销是生成 xml 文件的时候,如果不选预告数据,选择全部数据的话,分分钟飙到 700 多兆。 改用 XMLWriter ,内存降到 100 兆以内了。生成速度还更快。

TakcC commented 3 weeks ago

亲测是PHP脚本导入SQLite时转码和导入时间过长,我在Arm平台上测试需要峰值600MB内存,amd64平台需要300~400MB不等,且SQLite仓库不支持高并发,我的那个仓库mxd's EPG的代码就是基于老张的改的,他原版就是SQLite数据库,api那边请求一高就锁库,所以我才改为MySQL+Redis。 以下是个AI的答复,仅供参考,比我测试的数据还要离谱些 如果需要一个粗略的最大值估算,考虑到可能的缓存、批量操作和PHP脚本的开销,可能需要预备高达500MB到1GB的内存。然而,这个数字需要根据实际情况进行测试和调整。如果需要更精确的内存使用估算,可以在PHP脚本中使用memory_get_usage()函数来监测内存使用情况,并根据测试结果进行优化 。

奇怪,我这边也测试过,在 armamd64 平台上,这几个源最大消耗内存都是 100~200M。 SQLite 的话,可能因为我这边只有几个朋友在用,2G4M 的小水管也绰绰有余了。 如果像你这样,打算提供给大家用,还是得 MySQL + Redis

如果你的主机设置有swap,那么docker会使用它,导致内存估计并不准确

嗯嗯,应该是这个原因。 换了一个方案,明天发布之后帮忙测试一下 :)

TakcC commented 2 weeks ago

更新了,有空帮忙测试一下。 在我这边 amd64 跟 arm64 内存占用都降到 100M 以内了。

mxdabc commented 2 weeks ago

更新了,有空帮忙测试一下。 在我这边 amd64 跟 arm64 内存占用都降到 100M 以内了。

实测amd64121MB,arm64109MB,再次感谢 @TakcC ,向您致敬

TakcC commented 2 weeks ago

更新了,有空帮忙测试一下。 在我这边 amd64 跟 arm64 内存占用都降到 100M 以内了。

实测amd64121MB,arm64109MB,再次感谢 @TakcC ,向您致敬

:)