Datasets documentation

Datasets 🤝 Arrow

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