基于AWS的大规模Python数据分布式读写存储方案咨询
最优方案建议
一、Embedding 存储场景(200-800万样本,float16 200维)
排除的格式及原因
- CSV:存储数组型数据效率极低,读写均为O(n),完全不符合需求。
- .npy:单个文件无法高效追加/覆写(需重写整个文件),分片管理繁琐,S3上传下载体验差,排除。
- Parquet:列式存储适合批量读写,但按键随机读写(O(1))无法实现,覆写单条数据需重写整个行组,不符合需求。
推荐方案
1. LMDB(优先推荐)
- 完全键值对模型,原生支持O(1)插入、覆写、读取,完美匹配你的性能需求。
- 高并发友好:专为多进程/线程场景设计,写入时无需复杂锁机制(内部已处理),适合多GPU生成数据的场景。
- 文件特性:存储为单个(或可配置分片)文件,上传S3只需传输单个文件,避免递归下载的麻烦。
- 读写操作示例:
import lmdb import numpy as np # 写入 env = lmdb.open('embeddings.lmdb', map_size=1024*1024*1024*20) # 配置20GB存储上限 with env.begin(write=True) as txn: sample_id = 'sample_123' embedding = np.random.randn(200).astype(np.float16) txn.put(sample_id.encode(), embedding.tobytes()) # 覆写直接put同名键即可 # 读取 with env.begin() as txn: data = txn.get('sample_123'.encode()) embedding = np.frombuffer(data, dtype=np.float16) - 空间权衡:默认不压缩,可牺牲空间换取极致读写速度。
2. HDF5(备选,适合需额外元数据的场景)
- 支持键值对式存储(通过Groups/Datasets实现),可动态创建/覆写Dataset,实现O(1)级别的插入与覆写。
- 多进程写入:使用h5py库时,开启
libver='latest'模式,支持多进程安全写入(需确保各进程操作不同Dataset)。 - S3适配:可通过s3fs直接将HDF5文件写入S3,或本地生成后上传单个大文件,管理便捷。
- 读取时按sample_id直接定位Dataset,无需加载整个文件,实现O(1)读取。
二、JSON 对象存储场景
推荐方案
1. JSON Lines(.jsonl)+ 索引文件(优先推荐)
- 格式简单:每行一个JSON对象,支持O(1)追加写入(直接在文件末尾追加行),多进程写入可通过文件锁或分片写入后合并实现。
- 快速读取:生成一个单独的索引文件(如JSON格式),记录每个sample_id对应的行号,读取时先查索引定位行号,再快速读取对应行,接近O(1)性能。
- S3友好:单个大文件可直接上传,也可利用S3 Select直接查询文件内容,无需全量下载。
2. BSON(备选,更高效率的二进制JSON)
- MongoDB原生二进制格式,比JSON更紧凑,读写速度更快,支持复杂JSON结构。
- 键值对存储模式,支持O(1)插入、覆写、读取,适合多进程写入场景。
- 存储为单个文件,S3传输便捷,Python可通过
bson库直接操作。
内容的提问来源于stack exchange,提问作者Aswin Sivaraman
相关产品推荐
相关产品推荐

