问题描述
Zvec Python 绑定的 \Collection\ 对象没有提供 \close()\ 方法。当 collection 被打开后,C++ 底层会持有文件锁(特别是 \scalar.0.ipc\ 等文件),导致:
- Python 进程退出前无法删除数据目录
- 无法在同一进程中重新打开同一个目录
- 在 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
问题描述
Zvec Python 绑定的 \Collection\ 对象没有提供 \close()\ 方法。当 collection 被打开后,C++ 底层会持有文件锁(特别是 \scalar.0.ipc\ 等文件),导致:
复现步骤
\\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()
之后可以安全删除或重新打开
\\
影响范围
临时解决方法
目前只能在 Python 进程退出后手动删除目录,或在进程退出前依赖 GC 回收(但 C++ 层文件锁可能仍未被释放)。
建议
在 Python 绑定的 \Collection\ 类中添加 \close()\ 方法,委托给 C++ 层的析构/关闭逻辑。
环境