Chroma from_documents崩溃,错误码-1073741819(0xC0000005)无报错信息
问题:LangChain+Chroma执行嵌入时程序崩溃(错误码0xC0000005)
我正在使用LangChain与Chroma对形状为(1350,10)的DataFrame执行嵌入操作,实现代码如下:
def embed_with_chroma(persist_directory=r'./vector_db/', db_directory=r'./sql/sop_database.sqlite', collection_name='sop_vectorstore', batch_size=200): """ Reads all data from an SQLite database, converts it to embeddings, and saves to disk in batches. """ # Initialize the embedding model embedding_model = HuggingFaceEmbeddings(model_name="source_data/BAAI", model_kwargs={'device': 'cpu'}) # Query to get all data query = """ SELECT m.model_name AS "model", m.brand AS "brand", m.product_line AS "product_line", g.group_name AS "group", s.step_name AS "step", s.detail FROM Steps s JOIN Groups g ON s.group_id = g.group_id JOIN Models m ON g.model_id = m.model_id ORDER BY m.model_name, g.group_name, s.step_id; """ conn = sqlite3.connect(db_directory) df = pd.read_sql_query(query, conn) conn.close() # Prepare data in batches to manage memory usage vectorstore = None total_epochs = (len(df) // batch_size) + 1 epoch = 1 for start in range(0, len(df), batch_size): print(f'epoch {epoch}/{total_epochs}') batch_df = df.iloc[start:start + batch_size].copy() batch_df['merge'] = batch_df.apply(lambda row: f"Model: {row['model']}, Group: {row['group']}, Step: {row['step']}", axis=1) # Load documents and split into chunks loader = DataFrameLoader(batch_df, page_content_column='merge') documents = loader.load() text_splitter = CharacterTextSplitter(chunk_size=512, chunk_overlap=128) documents_chunks = text_splitter.split_documents(documents) # Initialize or append to vectorstore if vectorstore is None: vectorstore = Chroma.from_documents(documents_chunks, embedding_model, collection_name=collection_name, persist_directory=persist_directory) else: vectorstore.add_documents(documents_chunks) # Free up memory del batch_df, loader, documents, documents_chunks gc.collect() epoch += 1 return vectorstore
运行Chroma.from_documents时程序直接崩溃,仅输出错误信息:
Process finished with exit code -1073741819 (0xC0000005)
我的环境配置为8GB内存,DataFrame包含1350行10列,已尝试调整内存与批处理大小,但崩溃问题仍持续且无额外报错信息。
原因分析
- 错误码
0xC0000005是Windows系统的访问违规错误,本质是程序尝试访问了不被允许的内存区域,常见原因包括内存越界、空指针引用,或是底层C/C++依赖库(如Chroma依赖的sqlite3、HuggingFace模型的底层实现)出现内存异常。 - 结合你的场景,大概率是以下情况之一:
- BAAI嵌入模型在CPU运行时,内存碎片化或临时内存溢出触发非法访问;
- Chroma初始化阶段,磁盘写入或内存映射文件操作异常;
- 文本分割后的chunk处理逻辑存在隐性内存泄漏或越界问题。
调试建议
- 最小化测试定位问题:
- 先用10行小规模数据运行测试,若不崩溃则逐步增加数据量,定位触发崩溃的临界数据规模;
- 注释掉文本分割步骤,直接使用原文本生成嵌入,排查是否是分割逻辑导致的问题。
- 调整嵌入模型配置:
- 给
HuggingFaceEmbeddings添加encode_kwargs={'normalize_embeddings': False},减少计算内存开销; - 替换为轻量嵌入模型(如
all-MiniLM-L6-v2)测试,排除BAAI模型本身的兼容性问题。
- 给
- 优化Chroma初始化逻辑:
- 先创建空Chroma向量库,再批量添加文档,替代首次用
from_documents初始化的方式:# 替换原初始化代码块 if vectorstore is None: vectorstore = Chroma(collection_name=collection_name, embedding_function=embedding_model, persist_directory=persist_directory) vectorstore.add_documents(documents_chunks) - 每次添加文档后立即调用
vectorstore.persist(),避免内存缓存过多数据。
- 先创建空Chroma向量库,再批量添加文档,替代首次用
- 内存监控与泄漏排查:
- 使用
psutil在关键步骤打印内存占用,定位内存突增点:import psutil # 在batch处理、嵌入生成、Chroma操作后添加 print(f"当前内存占用: {psutil.Process().memory_info().rss / 1024 ** 2:.2f} MB") - 开启
tracemalloc跟踪内存分配,定位泄漏源:import tracemalloc tracemalloc.start() # 执行你的嵌入代码 snapshot = tracemalloc.take_snapshot() top_stats = snapshot.statistics('lineno') print("内存占用Top10:") for stat in top_stats[:10]: print(stat)
- 使用
- 环境与依赖检查:
- 更新LangChain、Chroma、transformers等依赖库到最新版本,修复已知内存bug;
- 检查
persist_directory所在磁盘的空间与读写权限,确保磁盘操作正常; - 关闭其他高内存占用程序,为Python进程释放更多内存资源。
内容的提问来源于stack exchange,提问作者vincentlai
相关产品推荐
相关产品推荐

