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

Fields

No fields configured for issues without a type.

Projects

Status
In progress

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions