（空气呼啸） (air whooshing)
（徽标弹出） (logo popping)
（金属滑动） (metal sliding)
- 内存映射和流式数据。 - Memory mapping and streaming.
在本视频中，我们将了解 In this video, we'll take a look
Datasets 库的两个核心特性 at two core features of the Datasets library
在不耗尽笔记本电脑的 CPU 资源的前提下 that allow you to load and process huge datasets
允许你加载和处理庞大的数据集。 without blowing up your laptop's CPU.
如今，工作上处理多达数个 GB 体量的数据集 Nowadays, it's not uncommon to find yourself
已经不是什么新鲜事了， working with multi-GB sized datasets,
特别是如果你打算预训练 especially if you're planning to pretrain
类似 BERT 或 GPT-2 这样的 transformer。 a transformer like BERT or GPT-2 from scratch.
在这些场景下，即使加载数据也可能是一个挑战。 In these cases, even loading the data can be a challenge.
例如，用于预训练 T5 的 c4 语料库 For example, the c4 corpus used to pretrain T5
包含超过 2 TB 的数据。 consists of over two terabytes of data.
为了处理这些大型数据集， To handle these large datasets,
Datasets 库建立在两个核心特性之上： the Datasets library is built on two core features:
Apache Arrow 格式和流式 API。 the Apache Arrow format and a streaming API.
Arrow 专为高性能数据处理而设计 Arrow is designed for high-performance data processing
并代表每个类似表格的 and represents each table-like dataset
基于列格式的数据集。 with a column-based format.
正如你在此示例中所见，基于列的格式 As you can see in this example, column-based formats
将表格的元素分组缓存到连续的 RAM 块中 group the elements of a table in consecutive blocks of RAM
这实现了快速访问和处理。 and this unlocks fast access and processing.
Arrow 擅长处理任何规模的数据 Arrow is great at processing data at any scale
但有些数据集很大 but some datasets are so large
你甚至不能把它们完全放在你的硬盘上。 that you can't even fit them on your hard disk.
所以对于这些情况，Datasets 库提供了 So for these cases, the Datasets library provides
允许你逐步下载的流式 API a streaming API that allows you to progressively download
可以每次下载原始数据的一个元素。 the raw data one element at a time.
结果是一个称为 IterableDataset 的特殊对象 The result is a special object called an IterableDataset
我们接下来就会看到更多细节。 that we'll see in more detail soon.
让我们先来看看为什么 Arrow 如此强大。 Let's start by looking at why Arrow is so powerful.
第一个特点是它将每个数据集 The first feature is that it treats every dataset
作为内存映射文件处理。 as a memory-mapped file.
现在，内存映射是一种机制 Now, memory mapping is a mechanism
映射文件的一部分或整个文件和光盘 that maps a portion of a file or an entire file and disc
到一大块虚拟内存。 to a chunk of virtual memory.
这允许应用程序 This allows applications
访问一个非常大的文件的片段 to access segments of an extremely large file
而无需先将整个文件读入内存。 without having to read the whole file into memory first.
Arrow 内存映射功能的另一个很酷的特性 Another cool feature of Arrow's memory mapping capabilities
是它允许多个进程 is that it allows multiple processes
使用相同的大型数据集 to work with the same large dataset
而无需以任何方式移动或复制它。 without moving it or copying it in any way.
Arrow 的这种零拷贝功能 This zero-copy feature of Arrow
使得迭代数据集的速度非常快。 makes it extremely fast for iterating over a dataset.
这个例子，你可以看到我们使用 And this example, you can see that we iterate
普通的笔记本电脑在一分钟之内迭代 over 15 million rows in about a minute
大约超过 1500 万行数据。 just using a standard laptop.
这还不算太糟糕。 That's not too bad at all.
现在让我们看一下如何流式传输大型数据集。 Let's now take a look at how we can stream a large dataset.
你需要做的唯一修改是 The only change you need to make is to set
设置 load_dataset () 函数中的 streaming=True 参数。 the streaming=True argument in the load_dataset () function.
这将返回一个特殊的 IterableDataset 对象 This will return a special IterableDataset object
这与 Dataset 对象有点不同 which is a bit different to the Dataset objects
我们在其他视频中看到过。 we've seen in other videos.
这个对象是一个可迭代的， This object is an iterable,
这意味着我们不能索引它来访问元素， which means we can't index it to access elements,
但相反我们使用 iter but instead we iterate on it
和 next 方法迭代它。 using the iter and next methods.
这将下载并访问 This will download and access
来自数据集的单个示例， a single example from the dataset,
这意味着你可以逐步迭代 which means you can progressively iterate
庞大的数据集，而无需提前下载它。 through a huge dataset without having to download it first.
使用 map () 方法标记文本 Tokenizing text with a map () method
也以类似的方式工作。 also works in a similar way.
我们首先流式传输数据集 We first stream the dataset
然后将 map () 方法与分词器一起应用。 and then apply the map () method with the tokenizer.
要获得第一个词元化示例，我们应用 iter 和 next。 To get the first tokenized example, we apply iter and next.
与 IterableDataset 的主要区别在于 The main difference with an IterableDataset is that
并未使用 select () 方法返回示例， instead of using a select () method to return examples,
而是使用 take () 和 skip () 方法 we use the take () and skip () methods
因为我们无法索引数据集。 because we can't index into the dataset.
take () 方法返回 The take () method returns
数据集中的前 N 个示例， the first N examples in the dataset,
而 skip ()，如你所想， while skip (), as you can imagine,
跳过第一个 N 并返回其余的。 skips the first N and returns the rest.
你可以看到这两种方法的实际示例 You can see examples of both of these methods in action
我们在哪里创建验证集 where we create a validation set
来自前 1000 个示例 from the first 1000 examples
然后跳过那些来创建训练集。 and then skip those to create the training set.
（空气呼啸） (air whooshing)