2.1 KiB
2.1 KiB
data/
C implementation of dataset loading and processing.
Python counterpart
datasets - https://github.com/huggingface/datasets
Why datasets?
HuggingFace datasets provides:
- Unified dataset loading (local files, HuggingFace Hub)
- Memory-mapped files for large datasets
- Streaming for datasets that don't fit in memory
- Data transforms and filtering
Built on Apache Arrow for efficient columnar storage.
Scope
This module implements:
- JSONL loading - Line-delimited JSON (most common format)
- Memory mapping - Handle datasets larger than RAM
- Batching - Create training batches
- Shuffling - Randomize data order
- binidx format - Pre-tokenized binary format (fast loading)
Getting Started
Dependencies
- tokenizer/ module (for on-the-fly tokenization)
- Optional: mmap support (POSIX)
Key Files to Study
From datasets:
src/datasets/arrow_dataset.py- Core dataset classsrc/datasets/iterable_dataset.py- Streaming datasets
From PyTorch:
torch/utils/data/dataloader.py- DataLoader pattern
Core API
// Load dataset
fd_dataset* fd_load_jsonl(const char* path);
fd_dataset* fd_load_binidx(const char* path); // Pre-tokenized
// Dataset info
int64_t fd_len(fd_dataset* ds);
tm_tensor* fd_get(fd_dataset* ds, int64_t index);
// DataLoader
fd_dataloader* fd_dataloader_new(fd_dataset* ds, int batch_size, bool shuffle);
tm_tensor* fd_next_batch(fd_dataloader* dl); // Returns NULL at end
void fd_reset(fd_dataloader* dl);
// Transforms
fd_dataset* fd_map(fd_dataset* ds, tm_tensor* (*fn)(tm_tensor*));
fd_dataset* fd_filter(fd_dataset* ds, bool (*fn)(tm_tensor*));
fd_dataset* fd_shuffle(fd_dataset* ds, int seed);
// Memory-mapped loading
fd_dataset* fd_load_mmap(const char* path);
Implementation Order
- JSONL parser
- In-memory dataset
- Batching and iteration
- Shuffling
- Memory-mapped loading
- binidx format (pre-tokenized)
- Streaming for very large datasets