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

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模型的底层实现)出现内存异常。
  • 结合你的场景,大概率是以下情况之一:
    1. BAAI嵌入模型在CPU运行时,内存碎片化或临时内存溢出触发非法访问;
    2. Chroma初始化阶段,磁盘写入或内存映射文件操作异常;
    3. 文本分割后的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(),避免内存缓存过多数据。
  • 内存监控与泄漏排查:
    • 使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:34:52