# 内嵌准备

## 概述

传统的数据准备方法是将原始数据源（通常是本地文件系统上的一个文件夹）转换为小于32GB的CAR文件集合。这种方法要求数据准备者拥有两倍的存储容量，这可能非常昂贵。例如，准备1 PB的数据集还需要另外1 PB的存储空间来存储CAR文件，总共需要2 PB的存储空间。

通过在线数据准备，可以将CAR文件的块映射回原始数据源，因此不需要存储导出的CAR文件。

<div align="center"><img src="https://github.com/data-preservation-programs/singularity/assets/12418265/4292faf1-9f01-4b7c-b79f-67b0bc1e2acc" alt="传统数据准备图示" width="500"> <img src="https://github.com/data-preservation-programs/singularity/assets/12418265/f5cfc209-5e38-4bb9-8cd9-f1aeffaf284d" alt="在线数据准备图示" width="500"></div>

## CAR获取的工作原理

通过在线数据准备，可以使用元数据数据库和原始数据源通过HTTP提供CAR文件，因为它知道如何将CAR文件的字节范围映射回原始数据源。

要通过HTTP提供CAR文件，只需启动内容提供程序

```sh
singularity run content-provider
```

> 注意：该命令将运行一个本地的HTTP服务器。如果你打算使其通过互联网访问，你可能希望将其放在一个反向代理后面，例如nginx。

如果数据源已经是一个远程存储系统（即S3或FTP），那么这将创建一个潜在的瓶颈，因为文件内容将通过Singularity内容提供程序代理到存储提供程序。

我们有一个解决这个挑战的方法，使用Singularity元数据API和Singularity下载工具。

要运行Singularity元数据API：

```sh
singularity run api
```

然后，使用Singularity下载工具（在存储提供程序上）：

```sh
singularity download <piece_cid>
```

Singularity元数据API将返回一个从原始数据源组装CAR文件的计划，Singularity下载工具将解释这个计划，并将数据从原始数据流式传输到本地CAR文件中。中间不会进行任何转换或组装，一切都以流的形式工作。

元数据API不会返回访问原始数据源所需的任何凭据。存储提供程序需要获取他们自己的访问数据源的凭据，并将这些凭据提供给`singularity download`命令。

## 额外开销

在线数据准备引入了一些极小的开销，主要是存储空间的需求。此外，计算和带宽开销也非常小。

每个数据块的元数据以数据库行的形式存储，对于每1 MiB的准备数据，大约需要100字节来存储映射元数据。对于1 PiB的数据集，大约需要100 GiB的磁盘空间来存储映射元数据。虽然这通常不是问题，但是具有大量小文件的数据集可能会导致显著的磁盘开销。

当需要从原始数据源动态重新生成CAR文件时，需要在数据库中交叉引用这些映射。然而，这通常不是一个问题。1 GB/sec的带宽等于1,000次数据库条目查找，远远没有所有支持的数据库后端的能力极限。此外，未来的优化可能进一步减少此开销。

## 启用在线数据准备

对于不需要加密的数据集，将自动启用在线数据准备。在创建数据集时，指定输出目录后，CAR文件将导出到该位置。CAR文件检索请求将优先考虑这些目录。如果用户删除了CAR文件，系统将回退到从原始数据源获取。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://data-programs.gitbook.io/singularity/zh/topics/inline-preparation.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
