Datasets documentation

Datasets 🤝 Arrow

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.2.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Datasets 🤝 Arrow

Arrowとは何ですか?

Arrowは、大量のデータを高速に処理・移動することを可能にします。これは、データをカラムナリーなメモリレイアウトで保存する特定のデータ形式です。これにより、いくつかの重要な利点があります:

  • Arrowの標準形式により、ゼロコピー読み取りが可能になり、シリアライズのオーバーヘッドがほぼ完全に排除されます。
  • Arrowは言語非依存であるため、さまざまなプログラミング言語をサポートしています。
  • Arrowはカラム指向であるため、データのスライスやカラムのクエリおよび処理が高速です。
  • Arrowは、NumPy、Pandas、PyTorch、TensorFlowなどの標準的な機械学習ツールへのコピーなしの引き継ぎを可能にします。
  • Arrowは、ネストされたものを含む多くのカラムタイプをサポートしています。

メモリマッピング

🤗 Datasetsは、ローカルキャッシュシステムにArrowを使用しています。これにより、ディスク上のキャッシュをバックエンドに持つことが可能になり、高速な検索のためにメモリマップリングが行われます。 このアーキテクチャにより、比較的小さなデバイスメモリを持つマシンでも、大規模なデータセットを使用できます。

例えば、英語版Wikipediaの完全なデータセットを読み込むには、RAMを数MBしか消費しません。

>>> 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 を使用してメモリマップドデータセットを反復処理するのは高速です。ラップトップで Wikipedia を反復処理すると、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
Update on GitHub