You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过FileMaker ODBC批量获取CRM数据时内核崩溃求助

内核崩溃原因分析:DSN连接CRM批量获取全量数据出错

我通过DSN连接CRM系统,尝试批量获取全量数据时触发内核崩溃,错误提示:"当前或之前单元格执行代码时内核崩溃,请检查相关代码或查看Jupyter日志获取详细信息"。测试非批量、非全量的查询代码可正常运行,但批量获取代码会导致内核崩溃。环境配置:Python 3.9.5,Windows 11 Pro,16GB内存(可用15.7GB)。

正常运行的非全量查询代码

import pandas as pd
import json
import requests
import pyodbc
from sqlalchemy import create_engine, inspect
import urllib.parse
import warnings
import os  # 原代码遗漏该模块,否则os.getenv会报错

warnings.filterwarnings("ignore")

dsn = f"DSN={os.getenv('DSN')};UID={os.getenv('UID')};PWD={os.getenv('PWD')}"

try:
    # 连接FileMaker数据库
    conn = pyodbc.connect(dsn)

    conn.setdecoding(pyodbc.SQL_CHAR, encoding='latin1')
    conn.setdecoding(pyodbc.SQL_WCHAR, encoding='latin1')
    conn.setencoding(encoding='latin1')
    
    # 查询前5行数据
    query = "SELECT * FROM Sales_2022 FETCH FIRST 5 ROWS ONLY"
    
    # 读取数据到DataFrame
    df = pd.read_sql(query, conn)
    
    # 关闭连接
    conn.close()

    # 打印结果
    print(df)

except pyodbc.Error as e:
    print("Error:", e)
except Exception as e:
    print("An unexpected error occurred:", e)

导致内核崩溃的批量获取代码

import pandas as pd
import json
import requests
import pandas as pd  # 重复导入pandas
import pyodbc
from sqlalchemy import create_engine, inspect
import urllib.parse
import warnings
import os  # 原代码遗漏该模块

warnings.filterwarnings("ignore")

dsn = f"DSN={os.getenv('DSN')};UID={os.getenv('UID')};PWD={os.getenv('PWD')}"

conn = pyodbc.connect(dsn)
""" # Create an SQLAlchemy engine
engine = create_engine("mssql+pyodbc:///?odbc_connect=" + urllib.parse.quote_plus(dsn))
"""

conn.setdecoding(pyodbc.SQL_CHAR, encoding='latin1')
conn.setdecoding(pyodbc.SQL_WCHAR, encoding='latin1')
conn.setencoding(encoding='latin1')

chunk_size = 10000
offset = 0
data = []

while True:
    query = f"""
    SELECT * FROM Sales_2022
    """
    chunk_df = pd.read_sql(query, conn)

    # 检查是否无数据
    if chunk_df.empty:
        break
    
    # 基于offset切片数据
    chunk_df = chunk_df[offset:offset+chunk_size]
    
    # 将切片后的数据加入列表
    data.append(chunk_df)
    
    # 更新offset
    offset += chunk_size

if data:
    df = pd.concat(data, ignore_index=True)
else:
    df = pd.DataFrame()

内核崩溃的核心原因

  1. 全量查询导致内存过载:代码中每次循环都执行SELECT * FROM Sales_2022,会一次性把整张表的所有数据加载到内存中。如果Sales_2022表数据量较大(如百万级以上),即使16GB内存也可能被耗尽,直接触发内核崩溃。
  2. 无限循环逻辑错误:当前循环中,if chunk_df.empty:判断的是全量查询的结果(永远不为空,除非表本身无数据),因此循环永远无法终止。每次循环都会重复加载全量数据,内存占用持续累积,最终耗尽系统内存导致内核崩溃。
  3. 冗余代码加剧资源消耗:重复导入pandas模块,虽然不是直接崩溃原因,但会增加不必要的资源占用,加速内存耗尽。

修复方案

  1. 数据库层面分页查询:修改SQL语句,使用OFFSET ... FETCH NEXT ... ONLY实现数据库端分页,每次仅加载指定大小的数据块,避免一次性加载全量数据:
while True:
    query = f"""
    SELECT * FROM Sales_2022
    OFFSET {offset} ROWS FETCH NEXT {chunk_size} ROWS ONLY
    """
    chunk_df = pd.read_sql(query, conn)
    if chunk_df.empty:
        break
    data.append(chunk_df)
    offset += chunk_size
  1. 清理冗余代码:删除重复的import pandas as pd语句,补充缺失的import os模块。
  2. 增加内存监控:在循环中添加内存监控代码,确认内存使用情况:
import psutil  # 需要先安装:pip install psutil

# 在循环内部添加
print(f"当前内存占用:{psutil.Process().memory_info().rss / 1024 ** 2:.2f} MB")

内容的提问来源于stack exchange,提问作者Sgumbaza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:30:14