SQLite在多线程中静默丢数据?揭秘Python默认isolation_level陷阱(附线程安全配置白皮书)

从零搭建OpenResearch:开放式研究资料聚合与协作系统实战 在数据管理与知识协作领域,开放式研究资料聚合系统正成为解决信息孤岛的关键技术。其核心原理是通过统一索引层整合异构数据源,利用SQLite FTS5实现高效全文检索,并借助FastAPI提供轻量级API服务。这种架构的技术价值在于打破工具壁垒,实现文献、笔记、代码等资源的关联查询与版本追踪。典型应用场景包括长期科研项目管理、技术博客素材整理以及团队协作中的资料共享。本文以OpenResearch为例,详细拆解了基于Python、SQLite和FastAPI的聚合系统搭建过程,涵盖Zotero文献索引、Mark 阅读详情
更多请点击: https://intelliparadigm.com

第一章:SQLite在多线程中静默丢数据?揭秘Python默认isolation_level陷阱(附线程安全配置白皮书)

SQLite 的 `sqlite3` 模块在 Python 中默认启用隐式事务管理,而其 `isolation_level=None`(即 autocommit 模式关闭)时,**每个 DML 语句(如 INSERT/UPDATE)会自动包裹在 BEGIN...COMMIT 中**——但该行为在线程间不共享连接对象,若多个线程共用同一 `Connection` 实例,将触发未定义行为,导致静默丢数据或 `ProgrammingError: SQLite objects created in a thread can only be used in that same thread`。

危险的共享连接模式

以下代码演示典型误用:
# ❌ 危险:全局共享 connection(非线程安全)
import sqlite3
import threading

conn = sqlite3.connect("app.db")  # 默认 isolation_level=""
def worker():
    conn.execute("INSERT INTO logs(msg) VALUES(?)", ("thread-" + str(threading.current_thread().ident),))
    conn.commit()  # 显式 commit 仍无法规避锁竞争与缓存不一致

threads = [threading.Thread(target=worker) for _ in range(5)]
for t in threads: t.start()
for t in threads: t.join()

线程安全三原则

  • 每个线程必须使用独立的 `Connection` 实例(不可复用)
  • 显式设置 `isolation_level=None` 启用 autocommit,避免隐式事务干扰
  • 对跨线程共享资源(如数据库文件路径)加锁,或使用 `threading.local()` 绑定连接

推荐配置方案

配置项推荐值说明
isolation_levelNone禁用自动事务,由开发者显式控制 BEGIN/COMMIT
check_same_threadFalse仅当配合线程本地存储时允许跨线程访问(需自行保证安全)
timeout30.0避免死锁,单位秒

第二章:SQLite线程模型与Python DB-API 2.0底层行为解剖

2.1 SQLite的三种线程模式(Single/Serialized/Multi)及其C接口映射

SQLite通过编译时宏与运行时标志协同控制线程安全策略,核心体现为三种线程模式:
模式特性对比
模式线程安全C初始化标志
Single-thread完全禁用互斥锁SQLITE_CONFIG_SINGLETHREAD
Multi-thread允许多线程使用独立数据库连接SQLITE_CONFIG_MULTITHREAD
Serialized全API线程安全(默认)SQLITE_CONFIG_SERIALIZED
初始化示例
sqlite3_config(SQLITE_CONFIG_SERIALIZED);
sqlite3_initialize();
该调用启用全局序列化锁,使所有 sqlite3_*函数可被任意线程并发调用;若省略此配置,则依赖编译时 SQLITE_THREADSAFE=1默认行为。
运行时连接约束
  • Single-thread模式下,任何跨线程使用同一sqlite3*句柄将导致未定义行为
  • Serialized模式允许同一连接被多线程复用,但内部通过递归互斥锁串行化所有操作

2.2 Python sqlite3模块初始化时的隐式check_same_thread与连接句柄绑定机制

默认线程安全策略
SQLite3连接默认启用 check_same_thread=True,强制连接句柄仅能被创建它的线程使用。该参数在 sqlite3.connect() 中隐式生效,不显式传参时即为 True。
import sqlite3
conn = sqlite3.connect("app.db")  # 等价于 connect(..., check_same_thread=True)
# 若在其他线程调用 conn.execute() → RuntimeError: SQLite objects created in a thread can only be used in that same thread.
此设计防止多线程并发访问引发内部状态竞争,但牺牲了跨线程复用灵活性。
连接与线程的强绑定原理
底层通过 _thread_id 字段记录创建线程标识,每次操作前校验当前线程 ID 是否匹配。
行为check_same_thread=Truecheck_same_thread=False
跨线程执行查询抛出 RuntimeError允许(需确保外部同步)
连接复用成本高(需 per-thread 连接池)低(可共享单连接)

2.3 isolation_level=None(autocommit模式)下事务边界失效的真实案例复现

问题场景还原
某金融对账服务在 PostgreSQL 中启用 isolation_level=None 后,出现“已扣款但未记账”的数据不一致现象。
关键代码片段
conn = psycopg2.connect(
    "dbname=test user=app", 
    isolation_level=psycopg2.extensions.ISOLATION_LEVEL_AUTOCOMMIT
)
cursor = conn.cursor()
cursor.execute("INSERT INTO tx_log (id, status) VALUES (%s, 'pending')")  # ✅ 自动提交
cursor.execute("UPDATE accounts SET balance = balance - %s WHERE uid = %s")  # ✅ 自动提交
# 若此处崩溃,前一条INSERT已生效,后一条UPDATE未执行 → 数据撕裂
该配置下每条语句独立提交,无法构成原子事务单元,导致跨表操作失去一致性保障。
对比行为差异
配置项事务边界异常中断影响
默认(isolation_level=READ_COMMITTED)BEGIN...COMMIT 显式界定全部回滚
isolation_level=None无事务边界,每语句即事务仅当前语句失败,此前语句已持久化

2.4 默认isolation_level=""(空字符串)触发隐式BEGIN导致的跨线程事务污染实验

问题复现场景
当 SQLite 连接未显式设置 isolation_level 时,其默认值为空字符串,会启用自动提交模式下的“隐式 BEGIN”,但该行为在线程间不隔离:
import sqlite3
import threading

conn = sqlite3.connect("test.db")
# isolation_level="" 是默认值,触发隐式事务控制

def worker():
    conn.execute("INSERT INTO t1 VALUES (1)")  # 隐式 BEGIN
    # 若另一线程在此刻提交,当前事务状态可能被干扰

threading.Thread(target=worker).start()
此代码中,多线程共享同一连接对象, isolation_level="" 导致各线程在执行 DML 时独立触发隐式事务,但底层共享同一个事务上下文,造成状态污染。
关键参数说明
  • isolation_level="":禁用自动提交,启用隐式事务(首次 DML 触发 BEGIN)
  • 线程共享连接:SQLite 连接对象非线程安全,隐式事务无线程局部存储
行为isolation_level=Noneisolation_level=""
自动提交✅ 启用❌ 禁用(需显式 commit)
隐式 BEGIN❌ 不触发✅ 执行 DML 时触发

2.5 使用threading.local+Connection代理实现隔离验证的调试脚本开发

核心设计思想
利用 threading.local() 为每个线程提供独立的数据库连接上下文,避免多线程间 Connection 交叉污染。
关键代码实现
import threading

_local = threading.local()

def get_db_conn():
    if not hasattr(_local, 'conn'):
        _local.conn = ConnectionProxy()  # 实例化带日志/校验的代理
    return _local.conn
该函数确保同一线程内多次调用返回同一代理实例; _local.conn 是线程私有属性,无需加锁,零竞争开销。
代理行为约束表
方法拦截逻辑验证目的
execute()记录SQL哈希+线程ID识别跨线程误调用
commit()校验事务是否由本线程开启防止事务归属错乱

第三章:数据丢失根因定位方法论

3.1 基于WAL模式日志与journal文件的原子写入链路追踪技术

核心写入流程
WAL(Write-Ahead Logging)要求所有变更先持久化到预写日志,再更新主数据页。journal 文件作为 WAL 的物理载体,承担事务原子性保障。
关键状态映射表
journal 状态WAL 阶段可恢复性
PREPARE日志头已刷盘支持回滚
COMMIT完整日志+checksum落盘强一致性保证
原子提交代码片段
// journal.Commit() 实现原子刷盘语义
func (j *Journal) Commit(txnID uint64) error {
    j.header.State = JournalCommit // 内存标记
    if err := j.fdatasync(); err != nil { // 强制刷盘
        return err // 失败则保持 PREPARE 状态
    }
    j.header.Checksum = j.calcChecksum() // 刷盘后计算校验和
    return j.fsyncHeader() // 二次刷盘 header,确保原子可见
}
该实现通过两次 fsync 保证:header 更新与 checksum 计算严格串行;仅当 header 成功落盘且 checksum 有效时,事务才被认定为 COMMIT 状态,避免部分写入导致的链路断裂。

3.2 利用sqlite3.enable_callback_tracebacks(True)捕获静默异常的实战调试

问题场景:用户自定义函数中的静默崩溃
SQLite 的 `create_function()` 注册的 Python 回调若抛出异常,默认被静默吞掉,仅返回 `NULL`,难以定位根源。
启用回溯的关键开关
import sqlite3
conn = sqlite3.connect(':memory:')
sqlite3.enable_callback_tracebacks(True)  # ← 启用后异常将输出到 stderr
conn.create_function('sqrt_safe', 1, lambda x: x ** 0.5 if x >= 0 else 1/0)
conn.execute("SELECT sqrt_safe(-1)").fetchone()
该调用会真实打印完整 traceback(含文件、行号、异常类型),而非静默失败。
典型异常对比表
设置异常表现调试成本
False(默认)SQL 返回 NULL,无日志高(需断点或日志埋点)
Truestderr 输出完整 traceback低(开箱即用)

3.3 多线程竞争下PRAGMA journal_mode、synchronous和busy_timeout协同失效分析

失效场景还原
当多线程并发执行写操作,且配置为 PRAGMA journal_mode = WAL; PRAGMA synchronous = NORMAL; 时, busy_timeout 可能无法有效缓解锁争用。
关键参数冲突
  • synchronous = NORMAL:WAL 模式下仅保证 wal 文件写入页缓存,不落盘;
  • busy_timeout:仅作用于 BUSY 状态(即 writer 正持有 WAL 锁),但 NORMAL 下 checkpoint 可能被延迟触发,导致 WAL 文件持续增长并阻塞 reader。
典型配置与行为对照
journal_modesynchronousbusy_timeout 效果
WALFULL稳定生效(writer 强制 fsync,reader 不阻塞)
WALNORMAL常失效(checkpoint 滞后 → WAL 堆积 → BUSY 频发)
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA busy_timeout = 5000; -- 实际中可能被 WAL 锁升级绕过
该配置下,当并发写线程触发 WAL 切换或 checkpoint 竞争时, busy_timeout 无法干预底层 WAL-index 页锁的持有逻辑,导致超时后仍返回 SQLITE_BUSY。

第四章:生产级线程安全配置白皮书

4.1 连接池化方案:pysqlite3+queue.LifoQueue实现线程专属Connection复用

设计动机
SQLite 的 `pysqlite3` 默认不支持多线程并发写入,而 `threading.local()` 开销较高;采用线程绑定 + LIFO 队列可兼顾复用性与隔离性。
核心实现
import pysqlite3 as sqlite3
from queue import LifoQueue

class ThreadLocalPool:
    def __init__(self, db_path, max_size=5):
        self.db_path = db_path
        self._pool = LifoQueue(maxsize=max_size)
        self._local = threading.local()

    def get_conn(self):
        if not hasattr(self._local, 'conn'):
            try:
                conn = self._pool.get_nowait()
            except Empty:
                conn = sqlite3.connect(self.db_path, check_same_thread=False)
            self._local.conn = conn
        return self._local.conn
`LifoQueue` 保证最近释放的连接优先复用,降低冷启动开销;`check_same_thread=False` 是线程安全前提,配合线程局部存储实现逻辑隔离。
连接生命周期管理
  • 每个线程首次调用 get_conn() 时创建专属连接
  • 连接不跨线程传递,避免锁竞争
  • 空闲连接自动归还至 LIFO 队列(需显式调用 put())

4.2 静态连接+显式事务控制:with语句嵌套+isolation_level=None的防误用模板

核心设计意图
该模板通过禁用自动事务( isolation_level=None)强制开发者显式调用 begin()、 commit() 或 rollback(),避免隐式提交导致的数据不一致。
安全嵌套结构
with sqlite3.connect(db_path, isolation_level=None) as conn:
    with conn:  # 显式事务上下文
        conn.execute("INSERT INTO logs (msg) VALUES (?)", ("start",))
        try:
            conn.execute("UPDATE accounts SET balance = balance - ? WHERE id = ?", (100, 1))
            raise ValueError("Simulated failure")
        except Exception:
            conn.rollback()  # 显式回滚,不受外层with影响
            raise
isolation_level=None 关闭自动事务,使每个 SQL 语句不自动开启事务;外层 with conn 触发 conn.__enter__() 手动启动事务,确保原子性与可控性。
关键参数对比
参数值事务行为适用场景
None完全手动控制金融级强一致性操作
""(空字符串)自动开启 DEFERRED 事务常规 CRUD

4.3 WAL模式+immutable参数+读写分离连接策略的高并发适配方案

核心配置协同机制
WAL 模式启用后,配合 immutable=1 参数可禁止对只读副本执行 DML,确保从库数据一致性。连接层通过路由标签自动分流:
PRAGMA journal_mode = WAL;
PRAGMA immutable = 1;
WAL 提升并发写吞吐,immutable 阻断非法写入,二者共同构成物理级只读保障。
读写分离策略
  • 写请求强制路由至主库(含 WAL 日志生成节点)
  • 读请求按负载权重分发至 WAL 同步完成的只读副本
同步状态校验表
节点类型WAL_SYNCimmutable
主库ON0
只读副本OFF(或 SYNC=NORMAL)1

4.4 基于pytest-xdist的多进程+多线程混合压力测试用例设计与断言校验框架

核心执行模型
pytest-xdist 通过 --numprocesses 启动多进程,每个进程内可结合 concurrent.futures.ThreadPoolExecutor 实现线程级并发请求,形成“进程×线程”二维负载矩阵。
典型测试用例结构
# test_hybrid_load.py
import pytest
from concurrent.futures import ThreadPoolExecutor, as_completed

@pytest.mark.parametrize("endpoint", ["/api/v1/users", "/api/v1/orders"])
def test_hybrid_stress(endpoint, base_url, session_pool):
    # 每进程启动8线程,每线程发50次请求
    with ThreadPoolExecutor(max_workers=8) as executor:
        futures = [executor.submit(session_pool.get, f"{base_url}{endpoint}") 
                   for _ in range(50)]
        for future in as_completed(futures):
            resp = future.result()
            assert resp.status_code == 200  # 粒度化断言
            assert "data" in resp.json()
该结构确保每个 pytest worker 进程独立管理连接池与线程上下文,避免全局状态竞争; max_workers 控制单进程并发度, --numprocesses=4 则总并发达 4×8=32。
断言校验策略对比
校验维度同步断言异步聚合断言
响应码一致性逐请求即时校验统计 200/4xx/5xx 分布
耗时 SLAP95 < 800ms全量采样后计算分位值

第五章:总结与展望

在实际微服务架构演进中,某金融平台将核心交易链路从单体迁移至 Go + gRPC 架构后,平均 P99 延迟由 420ms 降至 86ms,错误率下降 73%。这一成果依赖于持续可观测性建设与契约优先的接口治理实践。
可观测性落地关键组件
  • OpenTelemetry SDK 嵌入所有 Go 服务,自动采集 HTTP/gRPC span,并通过 Jaeger Collector 聚合
  • Prometheus 每 15 秒拉取 /metrics 端点,关键指标如 grpc_server_handled_total{service="payment"} 实现 SLI 自动计算
  • 基于 Grafana 的 SLO 看板实时追踪 7 天滚动错误预算消耗
服务契约验证自动化流程
func TestPaymentService_Contract(t *testing.T) {
  // 加载 OpenAPI 3.0 规范与实际 gRPC 反射响应
  spec := loadSpec("payment-openapi.yaml")
  client := newGRPCClient("localhost:9090")
  
  // 验证 CreateOrder 方法是否符合 status=201 + schema 匹配
  resp, _ := client.CreateOrder(context.Background(), &pb.CreateOrderReq{
    Amount: 12990, // 单位:分
    Currency: "CNY",
  })
  assert.Equal(t, http.StatusCreated, httpCodeFromGRPCStatus(resp.Status))
  assert.True(t, spec.ValidateResponse("post", "/v1/orders", resp))
}
技术债收敛路线图
季度目标验证方式
Q3 2024全链路 Context 透传覆盖率 ≥99.2%TraceID 在 Kafka 消息头、DB 注释、日志字段三端一致
Q4 2024服务间 gRPC 调用 100% 启用 TLS 双向认证Envoy SDS 动态下发 mTLS 证书,失败调用被 503 拦截

灰度发布流程:流量镜像 → 新版本无损启动 → Prometheus 对比 error_rate/latency_95 → 自动回滚阈值触发

15个大厂级Agent工程实战项目:从状态管理到生产可观测 Agent(智能体)是AI工程化落地的核心范式,其本质是任务编排、状态维护与工具协同的系统性实践。理解Agent需回归基础原理:如何持久化对话上下文、如何安全调度外部工具、如何在失败时精准降级与归因。这些能力直接决定AI应用在真实业务场景中的稳定性与可维护性。当前行业高频搜索聚焦于‘Agent开发实战’‘LangChain替代方案’‘生产级AI系统设计’等关键词,而本系列项目直击工程断层——覆盖SQLite状态管理、FastAPI裸金属工具链、Drools规则引擎、Resilience4j熔断降级、Open 阅读详情

相关推荐

Azure文档智能实战:向量检索+结构化解析的生产级落地

文档智能并非简单将PDF输入大模型,而是融合OCR解析、语义向量化与企业级搜索的系统工程。其核心原理在于通过Embedding将文本映射至高维向量空间,利用余弦相似度捕捉‘付款周期’与‘账期’等术语的语义关联,再依托Azure Cognitive Search实现混合检索(关键词+向量+元数据过滤),兼顾精度、性能与合规。该技术显著提升法务合同审查、HR制度问答、客服知识库等场景的召回准确率与溯源能力,尤其适用于需对接AD权限、保障数据不出域、支持扫描件与表格混合解析的中大型企业。本文聚焦Azure For

weixin_33747129的博客 396

SQLite数据库避坑指南:Python开发者常犯的5个错误及解决方案

本文为Python开发者提供了SQLite数据库的实用避坑指南,针对本地数据库应用中常见的5个错误,深入剖析了事务处理不当、并发写入冲突、备份恢复陷阱、数据类型亲和性误解以及连接管理问题。文章不仅解释了错误背后的原理,还给出了经过验证的解决方案,例如使用显式事务提升性能、设置WAL模式优化并发、利用在线备份API确保数据安全等,旨在帮助开发者构建更健壮、高效的SQLite应用。

weixin_29284657的博客 213

DeepSeek V4 Pro实战解析:百万Token上下文与国产算力适配

大语言模型的长上下文能力并非简单延长序列长度,而是涉及KV缓存管理、内存层级协同与动态预加载等底层机制;国产AI芯片适配也不仅是算子替换,更需重构编译器、通信库与显存调度策略。DeepSeek V4 Pro通过三级缓存协同(TLCC)实现百万Token高效推理,并在昇腾950上完成从CUDA到CANN的全栈迁移,显著提升Agent编程、RAG和私有化部署的工程落地性。其技术价值体现在真实业务延迟优化(如风控响应提速34%)、国产化成本可控性及复杂文档理解稳定性,适用于金融、政务、制造业等对数据主权与场景深度

414

Python SQLite:连接到数据库深度解析

本文详细解析了Python中使用sqlite3.connect()函数连接SQLite数据库的方法。文章首先强调了数据库连接的重要性,然后深入介绍了connect()函数的各个参数,包括database(文件路径与内存数据库)、timeout(锁定等待时间)、isolation_level(事务隔离级别)、detect_types(数据类型转换)和check_same_thread(线程安全)等关键参数。通过代码示例展示了如何连接到文件数据库和内存数据库,并提供了最佳实践建议,如使用with语句自动管理连接

weixin_42107409的博客 1644

MPT-30B深度解析:可信数据分层、ALiBi长上下文与双路径验证

大语言模型的可靠性不仅取决于参数规模,更依赖于事实可验证性、长程注意力稳定性与生成过程的结构化约束。可信度分层机制通过机器初筛、人工复核与动态淘汰三阶段过滤训练语料,显著提升知识准确性;ALiBi位置编码以线性衰减偏置替代RoPE,在128K上下文下实现注意力衰减可控,缓解专业文档‘首部遗忘’问题;双路径验证将语法树合法性校验与轻量化知识图谱置信度打分耦合进推理主干,使每个token生成兼具语言合规性与领域一致性。这些设计共同支撑MPT-30B在金融摘要、法律冲突识别、低资源方言转写等高要求场景中超越GPT

weixin_33895657的博客 2087

AI Agent Runtime 三层架构:Session、Harness 与 Sandbox 解析

AI Agent 运行时(Runtime)是支撑智能体工程化落地的核心基础设施,其本质是将状态管理、执行调度与安全隔离解耦为可独立演进的抽象层。Session 作为事件日志替代内存变量,实现无限上下文延展与故障可追溯;Harness 以无状态函数式设计保障弹性伸缩与行为确定性;Sandbox 则通过微秒级容器化隔离与凭证零接触机制,解决越权调用与资源污染风险。这种分层范式不仅提升系统可观测性与合规能力,更成为金融、医疗等强监管场景中‘敢用Agent’的技术前提。当前主流方案如 Anthropic Manag

xpp02的专栏 547

对.net事务隔离级别(IsolationLevel)的一个疑问

System.Transactions.IsolationLevel定义了一个对于事务隔离级别的枚举。MSDN里面的解释过于简单,这里粘贴一段从1werwerfer 的博客里拷来的解释,说得应该是非常清楚:1.ReadUncommitted – This is, essentially, no isolation. Anyone can read the data placed in a...

Zy0414的博客 916

具有PWM控制VSC-HVDC链路的IEEE30总线传输系统(Simulink仿真实现)

内容概要:本文构建了一个包含PWM控制VSC-HVDC链路的IEEE30节点电力传输系统,并基于Simulink平台完成了系统的建模仿真。该模型聚焦于高压直流输电(HVDC)技术在区域电网互联中的应用,采用电压源型换流器(VSC)与脉宽调制(PWM)技术实现高效、灵活的电能传输。研究重点在于分析VSC-HVDC链路在复杂多节点电网中对潮流分布、系统稳定性及电能质量的调控能力,特别关注其在区域电网互联、新能源大规模接入以及跨区域电力交换等场景下的动态响应特性与控制性能,为现代智能电网的发展提供技术支撑与仿真验证手段。; 适合人群:具备电力系统、电气工程或自动化等相关专业背景的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于研究VSC-HVDC在多节点电网(如IEEE30节点)中的建模与仿真方法;②分析PWM控制策略下HVDC链路对电网潮流分布、电压稳定性和故障穿越能力的影响;③为区域电网互联、新能源并网及智能电网调度等课题提供仿真基础和技术验证。; 阅读建议:此资源以Simulink仿真实现为核心,建议读者在掌握电力电子技术和电力系统分析基础知识的前提下,结合仿真模型深入理解VSC-HVDC的工作原理与控制策略。在学习过程中,应着重关注模型参数设置、控制环路设计及仿真结果的分析,以达到理论与实践相结合的目的。

Grok4动态专家路由架构解析:MoE与实时知识蒸馏实战

大模型推理正从单体架构迈向专业化协同范式,动态专家路由(Dynamic MoE)通过任务感知的子网调度,显著提升跨域因果链推理能力;实时知识蒸馏则突破训练数据截止限制,实现权威信源到推理模板的低延迟注入。该技术组合不仅优化token效率与事实准确率,更支撑金融、半导体、医药等强逻辑行业的RAG系统与决策引擎升级。本文深入拆解Grok4的三层路由机制、在线蒸馏管道与多粒度上下文协同设计,聚焦企业级部署中的MoE工程落地与知识时效性保障。

cri5768的博客 597

为什么你的Mac蓝牙总断连?深入解析硬件干扰与系统设置避坑

本文深入解析Mac蓝牙频繁断连的原因,包括硬件干扰(如WiFi同频干扰、USB设备电磁干扰)和系统设置问题,并提供详细的优化方案和诊断工具(如blueutil)使用指南,帮助用户有效解决蓝牙稳定性问题。

ik67890123的博客 683

win10离线安装.NetFrameWork3.5出现0x800F081F解决办法。

由于公司开发环境是内网,并且安装arcgis10.2又需要.NetFrameWork3.5的环境,安装.NetFrameWork3.5的又总是报错“0x800F081F”找不到源文件。折腾了两天总算解决了。 首先我们能在网上搜索到的教程,你一定看到过这样的教程,就是使用下面的命令来进行安装。 dism /online /Enable-Feature /Featu...

AIGIS的博客 1万+

SQLite学习笔记(未完待续)

SQLite学习笔记 Write-Ahead Logging 1. 概述 SQLite实现原子提交和回滚的默认方法是rollback journal。从3.7.0版本开始,可以使用Write-Ahead Log(简称WAL)。 WAL模式的优点: 在大多数场景明显更快; 读写操作可并发; 顺序访问磁盘; 使用fsync()操作更少,因此在调用fsync()中断的系统上更不容易发生问题; WAL模式的缺点: WAL模式通常要求VFS支持共享内存(例外情况见: WAL without shared mem

lidw0431的博客 1986

【CV论文精读】【协同感知综述】Collaborative Perception for Autonomous Driving :Current Status and Future Trend

感知是自动驾驶系统的关键模块之一,近年来取得了很大进展。然而,单个车辆的有限能力导致感知性能提高的瓶颈。为了突破个体感知的局限,协作感知被提出,它使车辆能够共享信息来感知视线和视野之外的环境。本文综述了有前途的协作感知技术的相关工作,包括介绍了基本概念,概括了协作模式,总结了协作感知的关键要素和应用。最后,我们讨论了这一研究领域面临的挑战和问题,并给出了一些潜在的进一步方向。

weixin_44184852的博客 4691

Isolation Level (隔离级别)

 Isolation Level (隔离级别)  图例:   MySQL InnoDB 引擎默认的隔离级别是 RR(Repeatable Read): 1 show variables like 'tx_is%'; 2 3 -- 更改 4 set global tx_isolation='read-committed'; 5 set global tx_isol...

weixin_30905981的博客 831

5分钟搞定mmdetection3d多模态推理可视化:从KITTI数据集到3D检测结果展示

本文提供了一份快速上手MMDetection3D进行多模态推理可视化的实战指南。文章详细介绍了从环境搭建、KITTI数据集准备,到模型选择、配置解析,再到执行多模态推理并生成3D检测结果可视化的完整流程,旨在帮助开发者在30分钟内快速验证模型并直观展示检测效果。

weixin_29051149的博客 251

Win7没有usb驱动怎么办?Win7没有usb驱动的解决方法

之后发现USB驱动不能够使用,那么碰到这种问题应该怎么办呢?下面就和小编一起来看看有什么解决方法吧。1、我们先使用驱动管理软件进行扫描安装驱动,如果安装后,还不行的话,我们就要进入到控制面板。我们经常会因为各种原因来更新电脑的系统,不过有一些小伙伴在重装完。4、点击usb选项后,找到显示感叹号和问号的usb驱动。2、在控制面板中,点击硬件声音,选择设备管理器。3、进入到设备管理器的页面,找到USB控制选项。6、如果计算机已经联网,我们可以在线更新驱动。5、然后鼠标右键点击更新驱动。

2401_88800025的博客 964

sqlite3 module

sqlite3.connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri]) 参数 uri True或False。当 uri=True,数据库被解释为一个 URI。这允许你指定一些查询参数选项,比如以“只读”模式打开数据可,如下: &amp;amp;amp;amp;amp;amp;amp;gt...

weixin_38853600的博客 1836

INFFUS 2025 | DDBFusion:基于双重分解和贝塞尔曲线的统一图像分解与融合框架

现有的图像融合算法大多集中于网络架构和损失函数的设计,采用统一的特征提取策略,却忽略了冗余信息和有效信息的划分。然而,对于互补信息而言,统一的特征提取器可能并不适用。因此,本文提出了一种基于贝塞尔曲线图像增强和分层分解的统一图像融合算法,并构建了一个自监督学习任务来学习有意义的信息。其中,贝塞尔曲线旨在模拟不同的图像特征,并构建特殊的自监督学习样本,因此作者的方法不需要特定任务的数据,并且可以在公共自然图像数据集上轻松进行训练。同时,作者的双重分解自监督训练方法可以为模型赋予冗余信息过滤能力。

小白学视觉 308

sqlite的wal模式

原文:https://www.sqlite.org/wal.html 预览 SQLite实现原子提交和回滚的默认方法是回滚日志。从3.7.0版本(2010-07-21)开始,可以使用一个新的“写前日志”选项(以下称为“WAL”)。 wal模式优点 大部分情况下,wal模式要比其他模式快很多; wal提供了更多的并发性,读时不会阻塞写,写时不会阻塞读; 使用wal使得磁盘IO操作更加连续; wal使用的fsync()操作要少得多,因此在fsync()系统调用中断的系统上,不太容易出现问题; wa

u010227042的博客 3564

Flink CDC 中 StartupOptions 模式详解

Flink CDC 的 StartupOptions 模式用于指定作业启动时从源数据读取数据的起始位置,不同的模式适用于不同的业务场景,可满足多样化的数据处理需求,主要有 Initial 模式、Earliest 模式、Latest 模式、SpecificOffset 模式和 Timestamp 模式。

RodJohnsonDoctor的专栏 849

【AI理论学习】手把手推导扩散模型:Diffusion Models(DDPM)

生成扩散模型DDPM如下图所示分为前向、逆向两个过程,它首先通过不断往原始清晰数据中添加噪声使其变成标准高斯噪声(前向过程),而后期望从标准高斯噪声中还原原始数据(逆向过程)。若能实现,那便可从已知的标准高斯分布中采样一个噪声数据,而后利用DDPM模型生成符合原始数据分布的新数据。 Diffusion模型包含两个过程:数学符号:y∝xy\propto xy∝x:y正比于x,即y随着x增大而线性增大。 条件概率:贝叶斯公式:p(A∣B)=p(B∣A)×p(A)p(B)p(A|B)=\frac{p(B|A)\

小哲的博客 1512

sqlite3读取一页的数据

学习目标:学习Sqlite3 源码 提示:这里可以添加学习目标 例如:一周掌握 Java 入门知识 学习内容: 1、 2020 12.28 学习pager相关内容及Btree内容并完成对页的寻找 2、 2020 12.29 继续学习pager相关内容,完成对页数据的查找 3、 掌握条件语句 4、 掌握循环语句 文章目录学习目标:学习Sqlite3 源码学习内容:前言一、pager的概念及结构总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接

weixin_37163556的博客 635

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【Spring学习33】Spring事务(3):事务属性之隔离级别(isolation level)

事务属性上文的例子中,在声明事务时,用到了@Transactional(readOnly = false, propagation = Propagation.REQUIRED)。 中间的参数readOnly,propagation我们称为事务属性。它就是对事务的基本配置。事务属性有五个方面:传播行为,隔离级别,事务超时时间,回滚规则,是否只读。 由属性接口TransactionDefiniti

程序老兵的博客 2万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 风控Python代码审计清单(含GDPR/银保监会最新要求):93%的团队漏掉了第4项
下一篇: Python风控配置即代码(CiC)实践指南:GitOps驱动的审计留痕+自动回滚+变更影响图谱
CompiWander
博客等级 码龄1年 168粉丝 1980原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值