Skip to content

[Bug]: Python Collection 缺少 close() 方法,导致 Windows 文件锁无法释放 #563

Description

@laolaola278-dev

问题描述

Zvec Python 绑定的 \Collection\ 对象没有提供 \close()\ 方法。当 collection 被打开后,C++ 底层会持有文件锁(特别是 \scalar.0.ipc\ 等文件),导致:

  1. Python 进程退出前无法删除数据目录
  2. 无法在同一进程中重新打开同一个目录
  3. 在 Windows 上问题尤其严重(文件锁是排他性的)

复现步骤

\\python
import zvec, os, shutil, tempfile

tmp = tempfile.mkdtemp()
schema = zvec.CollectionSchema(
name='test',
fields=[zvec.FieldSchema(name='x', data_type=zvec.DataType.INT64)],
vectors=[zvec.VectorSchema(name='v', data_type=zvec.DataType.VECTOR_FP32, dimension=2,
index_param=zvec.HnswIndexParam(metric_type=zvec.MetricType.COSINE, m=16, ef_construction=200))]
)

col = zvec.create_and_open(tmp, schema)
col.insert(zvec.Doc(id='1', vectors={'v': [1.0, 0.0]}, fields={'x': 1}))
col.optimize()

尝试删除数据目录 — 会失败

因为没有 close() 方法,C++ 层还持有文件锁

try:
shutil.rmtree(tmp)
print('删除成功')
except PermissionError as e:
print(f'删除失败: {e}')

尝试重新打开同一目录 — 也会失败

try:
col2 = zvec.open(tmp)
print('重新打开成功')
except Exception as e:
print(f'重新打开失败: {e}')
\\

预期行为

应有 \close()\ 方法,调用后释放所有底层资源:

\\python
col.close()

之后可以安全删除或重新打开

\\

影响范围

  • Windows 用户:无法在程序退出前清理数据,文件锁问题导致 shutil.rmtree 失败
  • 长期运行的服务:无法关闭旧 collection 后打开新的
  • 测试代码:每个测试用例后无法清理临时目录

临时解决方法

目前只能在 Python 进程退出后手动删除目录,或在进程退出前依赖 GC 回收(但 C++ 层文件锁可能仍未被释放)。

建议

在 Python 绑定的 \Collection\ 类中添加 \close()\ 方法,委托给 C++ 层的析构/关闭逻辑。

环境

  • Zvec v0.5.1(pip 安装)
  • Windows 10 x64
  • Python 3.11

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

Status
In progress

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions