WWW.YOUINFO.SITE
标签聚合 给出

/tag/给出

LinuxDo 最新话题 · 2026-06-11 17:33:51+08:00 · tech

NewAPI 的日志目前是单表存储,已经看到太多佬友因为日志撑爆磁盘了,下面给出一种解决方式,可能不完全兼容,但是个人测试下来没有什么问题 与 NewAPI 版本无关,基本所有版本都可以用,我用的版本是 1.0.0-rc.10 自带的日志删除 最常用的是使用 NewAPI 自带的 “清理历史日志” 来进行删除 // 代码逻辑如下 // 直接按照时间戳删除 LOG_DB.Where("created_at < ?", targetTimestamp).Limit(limit).Delete(&Log{}) 这里有两个问题: Delete 的效率不高,或者说在数据量过大的情况下使用 Delete 带来的 IO 可能成为灾难 Delete 之后磁盘空间并不会回收,需要手动回收 通过数据库分片解决日志删除 适用于 MySQL,如果您是其他的 DB 如 Postgres / SQLite,将下面的内容提供给 AI 相信也会有对应的解决方案 分片的核心逻辑是,将日志拆分到对应的日期上,比如分片 logs_20260601 只存储当天的数据,在超出需要删除的日期后,比如 1 个月后的 2026/07/01,直接删除 logs_20260601 分片,分片占用的空间会立刻释放,对应的日志数据也会直接删除 不过这里要提示您,所有的 DB 变更都可能引入风险,请您在执行前通过 mysqldump 或者类似工具,导出完整的数据结构和数据内容,确保执行出现异常可以随时回滚 执行下面的步骤前,建议停机,否则可能导致数据不完整 ,如果数据完整性不在考虑范围内,也可以在线更新 Step 1 检查数据符合预期 (Read) 执行下面的查询语句,确保 count 为 0,即所有的日志的创建时间不为空 SELECT COUNT(*) AS null_created_at_count FROM logs WHERE created_at IS NULL; Step 2 创建临时表 (Write) CREATE TABLE logs_new LIKE logs; Step 3 添加准备分区语句 (Read) 通过下面的 SQL,可以获得一个建表 SQL,对 DB 无任何副作用,可以放心执行 下面的 @start_date 和 @end_date 两行,可以按照您的实际数据存储情况调整,下面的配置为创建 180 天前到 7 天后的分区,如果您的日志已经回收或删除过了,可以考虑缩减分区数量 SET time_zone = '+08:00'; 这里可以按照您的需求调整为具体的时区 分区必须提前创建,否则插入数据会有问题 ,所以您至少需要创建 7 天后的备用 SET SESSION group_concat_max_len = 1024 * 1024; SET time_zone = '+08:00'; SET @start_date = DATE_SUB(CURDATE(), INTERVAL 180 DAY); SET @end_date = DATE_ADD(CURDATE(), INTERVAL 7 DAY); WITH RECURSIVE dates AS ( SELECT @start_date AS d UNION ALL SELECT DATE_ADD(d, INTERVAL 1 DAY) FROM dates WHERE d < @end_date ) SELECT GROUP_CONCAT( CONCAT( ' PARTITION p', DATE_FORMAT(d, '%Y%m%d'), ' VALUES LESS THAN (', UNIX_TIMESTAMP(DATE_ADD(d, INTERVAL 1 DAY)), ')' ) ORDER BY d SEPARATOR ',\n' ) INTO @parts FROM dates; SET @sql = CONCAT( 'ALTER TABLE logs_new MODIFY `created_at` bigint NOT NULL, DROP PRIMARY KEY, DROP INDEX `idx_created_at_id`, ADD PRIMARY KEY (`id`, `created_at`) PARTITION BY RANGE (`created_at`) ( ', @parts, ', PARTITION pmax VALUES LESS THAN MAXVALUE )' ); SELECT @sql; Step 4 执行分区语句 (Write) 执行上一步输出的 SQL,会将新的 logs_new 表调整为分区表 Step 5 导入旧的数据 (Write) 取决于您的数据量,这一步可能会花费一些时间 INSERT INTO logs_new SELECT * FROM logs; Step 6 校验数据已经导入完成 (Read) 如果您是停机更新,确保两条 SQL 输出的内容是一致的 如果您是在线更新,确保数据接近或一致 SELECT "logs" as `table`, COUNT(*), MIN(created_at), MAX(created_at) FROM logs UNION SELECT "logs_new" as `table`, COUNT(*), MIN(created_at), MAX(created_at) FROM logs_new; Step 7 确认分区 (Read) 下面的 SQL 会打印新表的所有分区,以及每个分区的数据量 SELECT PARTITION_NAME, PARTITION_DESCRIPTION, TABLE_ROWS FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'logs_new' ORDER BY PARTITION_ORDINAL_POSITION; Step 8 切表 (Write) 切换流量到新表,执行完成后请检查 NewAPI 各组件各页面是否能正常工作,特别是依赖日志的内容 RENAME TABLE logs TO logs_old, logs_new TO logs; Step 9 创建自动回收创建/分区任务 (Write) MySQL 不会自动创建或者删除分区,需要您创建定时任务来实现,下面会给出创建/删除分区的任务,您可以按需添加 Step 9.1 开启 MySQL Event Scheduler 在数据库中执行下面的命令,通常需要 root 用户,无需重启 SET GLOBAL event_scheduler = ON; SHOW VARIABLES LIKE 'event_scheduler'; 在配置文件的 mysqld 章节,增加下面的配置,无需重启 这一步是为了保证,即使后面重启数据库,Event Scheduler 仍然会是开启状态 [mysqld] event_scheduler=ON Step 9.2 创建新建分区任务 下面的两个 SQL 都需要执行 第一个 SQL 中的 SET time_zone = '+08:00'; 可按需修改为您的时区 第二个 SQL 中的时间您可以修改为适用于您的服务的时间,目前设置的是每天的 02:00,用于控制定时触发的时机 DELIMITER $$ DROP PROCEDURE IF EXISTS sp_logs_create_future_partitions$$ CREATE PROCEDURE sp_logs_create_future_partitions() BEGIN DECLARE v_i INT DEFAULT 0; DECLARE v_d DATE; DECLARE v_partition_name VARCHAR(32); DECLARE v_less_than BIGINT; DECLARE v_exists INT DEFAULT 0; DECLARE v_sql TEXT; SET time_zone = '+08:00'; WHILE v_i <= 7 DO SET v_d = DATE_ADD(CURDATE(), INTERVAL v_i DAY); SET v_partition_name = CONCAT('p', DATE_FORMAT(v_d, '%Y%m%d')); SET v_less_than = UNIX_TIMESTAMP(DATE_ADD(v_d, INTERVAL 1 DAY)); SELECT COUNT(*) INTO v_exists FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'logs' AND PARTITION_NAME = v_partition_name; IF v_exists = 0 THEN SET v_sql = CONCAT( 'ALTER TABLE logs REORGANIZE PARTITION pmax INTO (', 'PARTITION ', v_partition_name, ' VALUES LESS THAN (', v_less_than, '), ', 'PARTITION pmax VALUES LESS THAN MAXVALUE', ')' ); SET @sql = v_sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; SET v_i = v_i + 1; END WHILE; END$$ DELIMITER ; DROP EVENT IF EXISTS ev_logs_create_future_partitions; CREATE EVENT ev_logs_create_future_partitions ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURRENT_DATE, '02:00:00') DO CALL sp_logs_create_future_partitions(); Step 9.3 创建删除分区任务 (可选) 这个是用于替代 NewAPI 自带的删除数据任务,如果您有需要可以配置这里的自动删除 第一个 SQL 中的 INTERVAL 180 DAY 表示删除 180 天之前的数据,可以按需修改, SET time_zone = '+08:00'; 也可按需修改为您的时区 第二个 SQL 中的时间您可以修改为适用于您的服务的时间,目前设置的是每天的 03:00,用于控制定时触发的时机 DELIMITER $$ DROP PROCEDURE IF EXISTS sp_logs_drop_old_partitions$$ CREATE PROCEDURE sp_logs_drop_old_partitions() BEGIN DECLARE v_cutoff_date DATE; DECLARE v_cutoff_ts BIGINT; DECLARE v_drop_partitions TEXT; DECLARE v_sql TEXT; SET time_zone = '+08:00'; SET v_cutoff_date = DATE_SUB(CURDATE(), INTERVAL 180 DAY); SET v_cutoff_ts = UNIX_TIMESTAMP(v_cutoff_date); SELECT GROUP_CONCAT(PARTITION_NAME ORDER BY PARTITION_ORDINAL_POSITION) INTO v_drop_partitions FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'logs' AND PARTITION_NAME REGEXP '^p[0-9]{8}$' AND CAST(PARTITION_DESCRIPTION AS UNSIGNED) <= v_cutoff_ts; IF v_drop_partitions IS NOT NULL AND v_drop_partitions <> '' THEN SET v_sql = CONCAT( 'ALTER TABLE logs DROP PARTITION ', v_drop_partitions ); SET @sql = v_sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END IF; END$$ DELIMITER ; DROP EVENT IF EXISTS ev_logs_drop_old_partitions; CREATE EVENT ev_logs_drop_old_partitions ON SCHEDULE EVERY 1 DAY STARTS TIMESTAMP(CURRENT_DATE, '00:10:00') DO CALL sp_logs_drop_old_partitions(); Step 9.4 检查任务 show events; SHOW PROCEDURE STATUS WHERE Db = DATABASE(); Step 10 大功告成 一切已准备就绪,请使用吧!数据库将按照您的配置自动创建新的分片,回收旧的分片,后续如果有调整,也可以直接修改 SQL 配置再次执行。 您可以定期通过下面的 SQL 来检查分区任务的运行状态和分区的数据量,请检查 pmax 分区数据量为 0,且已经创建了 7 天后的分区 SELECT PARTITION_NAME, PARTITION_DESCRIPTION, TABLE_ROWS FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'logs' ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 15; 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-11 16:44:08+08:00 · tech

原文: 面对大型项目且模块多而复杂的情况,有没有好的ai开发方案,如果只给出需求让大模型自己做计划,它可能压根不会参考项目中已有的模块代码,或者开发及查bug、codereview时大模型需要每次现去读取代码,可能存在读取的代码不准确,或读取代码导致上下文越来越大,后续开发更混乱。大家的企业项目开发过程中有没有落地的好流程、方案? 让AI梳理了一下: 对于大型企业项目(代码量大、模块多、业务复杂)的场景,AI开发到底应该如何落地? 目前使用大模型辅助开发时,经常会遇到几个比较明显的问题: 缺乏项目全局认知 如果只是把需求直接丢给大模型,让它自己拆解和制定开发计划,它往往只能基于需求本身进行推理。 很难主动理解项目现有架构、模块边界、设计规范以及历史实现方式。 结果就是容易重复造轮子,甚至给出与现有架构冲突的方案。 无法充分复用已有代码 项目里明明已经有类似功能或公共模块,但大模型未必能发现。 开发出来的新代码可能绕开现有能力,导致逻辑重复、维护成本增加。 上下文窗口限制 开发、排查 Bug、Code Review 时,大模型往往需要临时读取相关代码。 随着代码、日志、需求文档不断加入上下文,Token 消耗越来越大。 后续可能出现上下文污染、遗忘早期信息、分析结果前后不一致等问题。 代码理解准确性问题 即使使用代码检索(RAG)方案,大模型读取到的代码片段也可能不完整。 缺少调用链、依赖关系、运行时信息时,容易做出错误判断。 有时候分析 Bug 的结论看起来很合理,但实际上是建立在错误代码理解之上的。 开发过程缺乏持续记忆 今天分析了某个模块,明天继续开发时可能又要重新让模型学习一遍。 对项目约定、业务规则、架构原则缺少长期记忆和沉淀。 导致每次会话都在重复做项目认知工作。 Code Review 效果不稳定 AI能发现一些明显问题,但对于复杂业务逻辑、架构设计缺陷、历史兼容性问题,效果参差不齐。 很依赖它是否恰好获取到了足够的上下文。 11 个帖子 - 5 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-10 10:19:54+08:00 · tech

你没看错,对话了3次,用了30块,主要让它评审项目中的提示词给出改进建议。 把fable给出的建议让gpt-5.5评审,80%同意,这是首次我测试中gpt-5.5同意claude的建议,以前都是claude完全同意gpt-5.5的建议。 所以不专业的判断,fable还是不能取代gpt-5.5,让它做个前期规划啥的应该不错,把钱花在刀刃上,干活还是让gpt-5.5,毕竟它那么贵,没几个能长期用的起的。 最佳实践仍是左右互搏,以前claude根本没法跟gpt-5.5博,现在可以搏一搏最佳实践了。 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-08 11:07:56+08:00 · tech

来L站有一段时间,在这一段体验当中发现了一些确实有影响到用户体验的地方,想给出一点建议。 在发话题的类型选择画面这里加一个发话题的格式提醒,在用户选择对应的话题类型后弹出格式注意,因为我发现很多人真的很难注意到社区规则的变动,如果有变动很多人发现的时候都是帖子被回退的时候。 或者直接加一个默认模板在发帖内容里,这样可以解决大多数人发帖不注意规则的情况,也可以减轻运营的压力 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-07 17:38:02+08:00 · tech

灵感来源: bilibili.com 为什么给出π的前面1亿位也无法让AI预测出后面的数字?_哔哩哔哩_bilibili 为什么给出π的前面1亿位也无法让AI预测出后面的数字?, 视频播放量 26608、弹幕量 9、点赞数 526、投硬币枚数 7、收藏人数 109、转发人数 24, 视频作者 castelu, 作者简介 浙江大学数学科学学院基础数学专业博士、高等院校数学系教师,国家级出版社出版教材《Linear... 给定 π 的前 n 位,训练出的 AI 可以预测 n+1 及以后的所有位数吗? π(在我们所观测到的精度下,几乎可以确定)是一个正规数,每一位数 0-9 出现的概率严格相等;前 n 位数字与第 n+1 位数字之间没有任何统计学上的相关性,因此无法通过预训练得到的非线性公式(也就是参数+模型架构)预测下一位 π是一个确定的可计算数,存在 Chudnovsky algorithm 等已知算法对π的真实值进行迭代计算;因此,当 n 足够大(题目中的 n 可以任取所需),计算机变量精度足够高时,存在一种可能性,通过大量数据得到的模型参数能够完美拟合 π 的真实值计算公式,并做出准确预测 讨论: Q1:是否会出现过拟合/欠拟合问题 A1: 几乎必然会出现,因为 π 是一个正规数,其前 n 项几乎没有任何简单的连续函数特征,训练时几乎必然无法正确收敛 Q2:假设训练集和训练方法足够完美,足以让模型绕开所有的过拟合与欠拟合,那么可以在有限状态机中完成预测吗 A2:绝对不可能,有限状态机无法生成无限不循环序列,而 π 的每一位放在一起就是无限不循环序列 Q3:在以上前提下,我们将程序放在一个时空复杂度均无限的真正的图灵机这种,那么可以完成训练和预测吗? A3:在没有先验知识的情况下,几乎不可能。假设我们真的给 AI 提供了 π 的前 n 位,并且真的让 Loss 严格归零,但是在数学上,依然存在无限多个完全不同的可计算序列,它们的前 n 位与 π 完全一模一样。在这种情况下,有且只有模型架构及训练得到的模型参数恰好完美符合 π 的真实值计算公式(如 Chudnovsky algorithm)能够完美拟合下一位,但能够吻合这一算法的测度几乎为0。同样的,没有先验知识支撑的 AI 算法也不可能将单一位的预测精度稳定地提高到 10% 以上。 Q4:假设我们在设计模型之初就引入了先验知识,通过模型架构和算法构造了一个完美计算 π 真实值的序列的算法,并且通过以上条件使 Loss 归零,那么可以完成预测吗? A4:这就是套了层 AI 训练的皮的传统算法。本质上,现在的 AI 之所以区别于传统算法,正是因为它牺牲了精度、换取了处理混沌数据的可能性,因此它根本不存在“精确预测”的说法。要让一个 AI 做“精确预测”,即使目标不是 π 这样复杂的算式,而是一个简单的无限循环小数,最终优化也会回归到传统算法。 但是以上讨论似乎都预设了一个事实: π 与其他无理数并无二致,且我们唯一知道的是它是一个无理数。 事实真的有这么简单吗?π 并不是一个真正的随机数,它的柯尔莫哥洛夫复杂度极低,虽然 Solomonoff Induction 在图灵机模型依旧中不可计算,但我们能否近似地设计一种简单假设,作为 AI 自我优化的条件以到解法?另一边,BBP 公式则揭示了 π 在十六进制下的特殊性质,它或许在其他进制或者复杂的几何空间中真的存在某种特征? 基于参数拟合的机器学习,其设计一定是或多或少地需要先验知识的: 至少,你需要确保你的训练集并不是绝对的混沌和随机 ;正如我们了解了图像的主要性质、及图像识别的主要矛盾,才能设计出 CNN 来应对;一个毫无先验知识、不做特殊设计的机器学习算法注定无法达成目标。 1 个帖子 - 1 位参与者 阅读完整话题

LinuxDo 最新话题 · 2026-06-07 15:33:22+08:00 · tech

抽象类 当父类的一些方法无法给出具体实现时,可以用abstract关键字来修饰该方法,不写方法体,把方法变成抽象方法,同时这个类也必须被修改为抽象类 抽象类的语法 abstract class XX {//这是抽象类 private String name; ​ public XX(String name) { this.name = name; } ​ public abstract void YY(); //这是抽象方法 } 抽象类的使用细节 抽象类可以没有抽象方法 抽象类不能被实例化,但可以有构造器 一旦类包含了abstract方法,则这个类必须被声明为abstract abstract只能修饰类和方法 抽象类的本质还是类,可以有类的一切内容 抽象方法不能有主体,即不能实现 如果一个类继承了抽象类,则它也必须实现抽象类的所有抽象方法,除非他自己也是抽象类 抽象方法不能被final、static、private修饰,因为这些都会阻碍类方法的重写 练习题 1)思考:abstract final class A{}能编译通过吗,why? 2)思考:abstract public static void test2()能编译通过吗,why? 3)思考:abstract private void test3();能编译通过吗,why? 答案是:都不能通过编译,final、static、private三者均阻碍类方法的重写 4)编写一个Employee类,声明为抽象类,包含如下三个属性:name,id,salary,提供必要的构造器和抽象方法:work()。对于Manager类来说,他既是员工,还具有奖金(bonus)的属性。请使用继承的思想,设计CommonEmployee类和Manager类,要求类中提供必要的方法进行属性访问,实现work(),提示“经理/普通员工名字工作中… 答案代码略:比较简单也比较长,就不放了 抽象类的最佳实践——模板设计模式 先阅读下面这段代码 public class TestTemplate { public static void main(String[] args) { new AA().job(); new BB().job(); } } ​ class AA { public void job() { long start = System.currentTimeMillis(); int sum = 0; for (int i = 1; i <= 100000000; i++) { sum += i; } long end = System.currentTimeMillis(); System.out.println("AA耗时:" + (end - start)); } } ​ class BB { public void job() { long start = System.currentTimeMillis(); int sum = 0; for (int i = 1; i <= 10000000; i++) { sum *= i; } long end = System.currentTimeMillis(); System.out.println("BB耗时:" + (end - start)); } } 我们可以发现,两个类中的job方法其实有重复性逻辑,我们考虑让其变简洁 于是我们可以考虑把job方法中的计时逻辑提取出来,只在job方法中保留工作逻辑 public void calTime() { long start = System.currentTimeMillis(); this.job(); long end = System.currentTimeMillis(); System.out.println("BB耗时:" + (end - start)); } public void job() { int sum = 0; for (int i = 1; i <= 100000000; i++) { sum += i; } } 这样虽然job里的内容少了,但是整体代码量并没有减轻,并且calTime方法的大部分逻辑在AA类和BB类中是重合的。假如还有CC、DD类,那会更加臃肿。 为了让代码更加简洁,复用性更高,我们对代码进行更进一步的修改,考虑把calTime方法统一提取到一个更高级别的类,在其中需要调用job方法,job方法的具体实现存在于子类中。 public class TestTemplate { public static void main(String[] args) { new AA().calTime(); new BB().calTime(); } } ​ abstract class Template { public void calTime() { long start = System.currentTimeMillis(); this.job(); long end = System.currentTimeMillis(); System.out.println("耗时:" + (end - start)); } ​ public abstract void job(); } ​ class AA extends Template { public void job() { int sum = 0; for (int i = 1; i <= 100000000; i++) { sum += i; } } } ​ class BB extends Template { public void job() { int sum = 0; for (int i = 1; i <= 100000000; i++) { sum += i; } } } 简单的说,抽象类的意义就是提升代码可复用性(把公共代码提取到父类抽象类中),同时定义统一规范(用抽象方法强制要求子类实现某些行为),告诉其他人,这个抽象类里哪些方法需要得到重写 2 个帖子 - 1 位参与者 阅读完整话题

IT之家 · 2026-06-06 18:45:15+08:00 · tech

IT之家 6 月 6 日消息,一汽红旗今日宣布,红旗首款硬派越野正式命名为“红旗 G919”。 官方给出了命名的含义,IT之家汇总如下: “G ”承“国车”脊梁、守护万里征途 “9”铸旗舰定位、彰显尊享智造 “1”流产品性能、臻享驾乘体验 “9”寓全维服务、久久相伴同行 这款新车曾在 2026 北京车展亮相,号称“中式美学赋能,硬核气场拉满,解锁民族越野新姿态”。新车配备矩形大灯,采用当下流行的“ 方盒子 ”造型设计。 新车配备了防撞杠、隔挡绳、拖车钩、车顶平台、探照灯、小书包以及越野 AT 轮胎等,进一步提升了硬核氛围;此外,车顶配备有激光雷达,预计将提供高阶辅助驾驶系统。