RayMemex:我的数据管理之道

当下时代,数据量、信息量激增,数据价值越来越大,硬盘也越来越大,在这一背景下,如何有效管理数据,是非常重要的问题。为此,我决定研发一款软件(ray_memex),来应对这一问题。

项目说明

在请教 ChatGPT 时,我需要用一段话来概括项目,以建立上下文。

我正在开发一个名为 ray_memex 的 Python 项目,该项目使用 Poetry 进行依赖管理,是一个基于 FastAPI 的后端应用。我已经将项目 Docker 化,并通过 Docker Compose 引入了两个依赖,分别是 MinIO 和 MongoDB。

我现在的问题是:

构想

基于本地文件系统。尽管可以选择云存储方案(MinIO、S3),但我选择传统的文件系统。本地浏览起来方便,无需特殊部署与运维。

多设备同步。所有数据作为整体数据集,我希望数据集在多台电脑上得以同步。因此在数据集中,只包含资源二进制和 Plain Text 文件,不包含 SQLite 等二进制索引。保证数据集是静态的,便于同步。

对于数据底层同步机制,我选择 syncthing。这样只要位于统一网络下,即可自动同步数据。

索引数据库:尽管数据集是静态的,程序会扫描数据集,生成一份索引数据库(SQLite)。后续的各种查询操作,都基于索引数据库进行。索引数据库是非永久性的,根据数据集能够重新创建。这个模式是向 Obsidian 等笔记软件学到的。

数据的类型:静态网页、电子书、时间序列、图片、视频、Text、Inbox(什么都能往里扔)。每类数据都有自身不同的 metadata。一旦存入数据集后,可以进行很多高级操作。比如电子书 PDF OCR、电子书转笔记、电子书转 LLM 语料,HTML 转 LLM 语料,视频字幕生成。这也是我开发这个软件的宏伟目标。

问题思考

  1. Multi-Device Data Management:Secure Storage with MinIO and MongoDB on NAS

索引

数据量大了之后,全量索引同步太慢怎么办?想到的办法使用建立 Journal 文件,对所有数据集操作进行 Journal 记录,这样每台机只要定期查询 Journal 并定期增量更新即可。

Journal 文件之间冲突怎么办?比如 A 机器进行了一些修改,B 机器进行了一些修改,导致 Journal 出现了分支,在 syncthing 同步时会导致冲突。一种方法是,使用 Git 仓库记录 Journal,靠远端仓库保障跨设备的日志一致性。

基础设施

文件的唯一标识

使用文件的 MD5 作为入库时的唯一标识。

一开始我打算使用 UUID 作为文件的唯一标识。直到我在开发「入库文件重复检测」这个功能时,我发现 UUID 仅是一个随机值,无法反应文件的特征,导致实现重复检测非常难。

每个文件还有一个伴随的 UUID.meta JSON 文件,里面包含了文件的元信息。

元信息分为通用元信息和专有元信息。通用元信息是作为文件的基本信息,专有元信息是针对不同类型的文件,进行的特殊元信息提取,比如针对电子书,提取出作者等信息。

元信息包含:

namespace

数据类型有多种多样。因此数据集通过 namespace 进行区分。常用 namespace 包括:

其中,有一个特殊的 namespace 为 auto,他会根据文件的后缀,自动进行分类。

基础操作

文件入库

只需要输入文件的路径(filepath)。入库的方法签名:

def dataset_insert_file(file_path, namespace=NAMESPACE_AUTO):
    """将文件插入数据集"""

其中:namespace 用于对数据进行区分。

首先,获取文件的扩展名。


本文作者:Maeiee

本文链接:RayMemex:我的数据管理之道

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!