Datasets 文件

Datasets 🤝 Arrow

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

Datasets 🤝 Arrow

什麼是 Arrow?

Arrow 能夠快速處理和移動大量資料。它是一種特定的資料格式,將資料以列式記憶體佈局儲存。這提供了幾個顯著的優勢。

  • Arrow 的標準格式允許零複製讀取,這幾乎消除了所有的序列化開銷。
  • Arrow 是語言無關的,因此它支援不同的程式語言。
  • Arrow 是面向列的,因此在查詢和處理資料切片或列時速度更快。
  • Arrow 允許無複製地將資料傳遞給標準的機器學習工具,如 NumPy、Pandas、PyTorch 和 TensorFlow。
  • Arrow 支援許多,可能是巢狀的,列型別。

記憶體對映

🤗 Datasets 使用 Arrow 作為其本地快取系統。它允許資料集由磁碟上的快取支援,該快取是記憶體對映的,以實現快速查詢。這種架構允許在裝置記憶體相對較小的機器上使用大型資料集。

例如,載入完整的英文維基百科資料集僅佔用幾 MB 的 RAM。

>>> import os; import psutil; import timeit
>>> from datasets import load_dataset

# Process.memory_info is expressed in bytes, so convert to megabytes 
>>> mem_before = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024)
>>> wiki = load_dataset("wikimedia/wikipedia", "20220301.en", split="train")
>>> mem_after = psutil.Process(os.getpid()).memory_info().rss / (1024 * 1024)

>>> print(f"RAM memory used: {(mem_after - mem_before)} MB")
RAM memory used: 50 MB

這是可能的,因為 Arrow 資料實際上是從磁碟進行記憶體對映的,而不是載入到記憶體中。記憶體對映允許訪問磁碟上的資料,並利用虛擬記憶體功能進行快速查詢。

效能

使用 Arrow 迭代記憶體對映的資料集速度很快。在筆記型電腦上迭代維基百科的速度可達 1-3 Gbit/s。

>>> s = """batch_size = 1000
... for batch in wiki.iter(batch_size):
...     ...
... """

>>> elapsed_time = timeit.timeit(stmt=s, number=1, globals=globals())
>>> print(f"Time to iterate over the {wiki.dataset_size >> 30} GB dataset: {elapsed_time:.1f} sec, "
...       f"ie. {float(wiki.dataset_size >> 27)/elapsed_time:.1f} Gb/s")
Time to iterate over the 18 GB dataset: 31.8 sec, ie. 4.8 Gb/s
< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.