通过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()
内核崩溃的核心原因
- 全量查询导致内存过载:代码中每次循环都执行
SELECT * FROM Sales_2022,会一次性把整张表的所有数据加载到内存中。如果Sales_2022表数据量较大(如百万级以上),即使16GB内存也可能被耗尽,直接触发内核崩溃。 - 无限循环逻辑错误:当前循环中,
if chunk_df.empty:判断的是全量查询的结果(永远不为空,除非表本身无数据),因此循环永远无法终止。每次循环都会重复加载全量数据,内存占用持续累积,最终耗尽系统内存导致内核崩溃。 - 冗余代码加剧资源消耗:重复导入
pandas模块,虽然不是直接崩溃原因,但会增加不必要的资源占用,加速内存耗尽。
修复方案
- 数据库层面分页查询:修改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
- 清理冗余代码:删除重复的
import pandas as pd语句,补充缺失的import os模块。 - 增加内存监控:在循环中添加内存监控代码,确认内存使用情况:
import psutil # 需要先安装:pip install psutil # 在循环内部添加 print(f"当前内存占用:{psutil.Process().memory_info().rss / 1024 ** 2:.2f} MB")
内容的提问来源于stack exchange,提问作者Sgumbaza
相关产品推荐
相关产品推荐

