| 398 | /// Parse a shard file's header from mmap'd data into typed entries. |
| 399 | #[cfg(unix)] |
| 400 | fn parse_shard_header_mmap(shard: &MappedShard) -> Result<(usize, HashMap<String, HeaderEntry>)> { |
| 401 | let data = shard.as_slice(0, shard.mmap_len.min(8)); |
| 402 | if data.len() < 8 { |
| 403 | bail!("shard file too small for header"); |
| 404 | } |
| 405 | let header_len = u64::from_le_bytes(data[..8].try_into().unwrap()) as usize; |
| 406 | if header_len > 50 * 1024 * 1024 { |
| 407 | bail!("safetensors header too large: {} bytes", header_len); |
| 408 | } |
| 409 | let header_data = shard.as_slice(8, header_len); |
| 410 | let header: HashMap<String, HeaderEntry> = serde_json::from_slice(header_data)?; |
| 411 | Ok((header_len, header)) |
| 412 | } |
| 413 | |
| 414 | /// Parse a shard file's header from file I/O into typed entries. |
| 415 | #[cfg(not(unix))] |