Python环境下存储5000万行6列单表的最佳写入与存储方案咨询
针对你处理5000万行、仅6列数据的场景,CSV确实在大数据量下读写效率极低——毕竟是行式存储,压缩差还慢。下面给你几个Python生态里实战性拉满的方案,按优先级排序:
1. 优先选列式存储格式:Parquet/ORC
这俩是大数据场景的标配,列式存储+高效压缩,比CSV体积小80%以上,读写速度快10-100倍,还能支持按列查询(不用读全表),完美适配你的6列小表场景。
用Python实现的话,推荐用pyarrow或者fastparquet库,配合pandas批量处理:
import pyarrow as pa import pyarrow.parquet as pq import pandas as pd # 假设你从API获取的是批量数据(一定要批量,别逐行处理!) batch_size = 100000 writer = None for batch_data in your_api_data_generator(batch_size): # 把批量数据转成DataFrame或者pyarrow Table df = pd.DataFrame(batch_data, columns=["col1", "col2", "col3", "col4", "col5", "col6"]) table = pa.Table.from_pandas(df) # 初始化写入器,设置压缩(snappy是平衡速度和压缩比的首选) if writer is None: writer = pq.ParquetWriter("large_data.parquet", table.schema, compression="snappy") writer.write_table(table) if writer: writer.close()
优点:压缩比高、读写快、跨语言支持(Java/Spark也能读)、支持分区存储;注意:一定要批量写入,别逐行追加,不然速度一样慢。
2. 轻量列式存储:Feather
如果你的数据只在Python生态里用,Feather是更轻量的选择——它是专门为Python/R设计的列式格式,读写速度比Parquet还快一点,体积略大,但胜在简单。
代码示例:
import pandas as pd import pyarrow.feather as feather # 同样批量处理,最后合并或者分批写入(Feather支持追加) df = pd.concat(your_batch_dfs) feather.write_feather(df, "large_data.feather") # 读取也超快 df_read = feather.read_feather("large_data.feather")
优点:极简API、读写速度拉满、支持追加;缺点:跨语言支持不如Parquet。
3. 文件型数据库:SQLite
如果之后需要对数据做复杂查询(比如过滤、聚合),SQLite是个不错的选择——无需服务器,单文件存储,支持批量插入,查询效率比CSV高N倍。
关键是要批量插入,别逐行execute:
import sqlite3 import pandas as pd conn = sqlite3.connect("large_data.db") cursor = conn.cursor() # 先建表 cursor.execute(""" CREATE TABLE IF NOT EXISTS data_table ( col1 INTEGER, col2 TEXT, col3 FLOAT, col4 INTEGER, col5 TEXT, col6 FLOAT ) """) # 批量插入,每10万行一批 batch_size = 100000 for batch_data in your_api_data_generator(batch_size): df = pd.DataFrame(batch_data, columns=["col1", "col2", "col3", "col4", "col5", "col6"]) df.to_sql("data_table", conn, if_exists="append", index=False, chunksize=10000) conn.commit() conn.close()
优点:支持SQL查询、事务安全、适合后续分析;注意:chunksize参数一定要设,不然内存会爆。
4. 备选:HDF5
如果需要分层存储(比如把不同批次的数据存在同一个文件的不同节点),HDF5可以考虑,pandas原生支持,但现在Parquet已经逐渐取代它了,不过老项目里还常用。
代码示例:
import pandas as pd # 批量写入 with pd.HDFStore("large_data.h5") as store: for i, batch_df in enumerate(your_batch_dfs): store[f"batch_{i}"] = batch_df # 读取 with pd.HDFStore("large_data.h5") as store: df = store["batch_0"]
优点:分层存储、支持压缩;缺点:跨语言支持差、体积比Parquet大。
最后提醒一句:不管选哪种方案,绝对不要逐行处理数据——一定要用批量生成器或者分块读取API数据,不然内存直接爆掉,速度也快不起来。
内容的提问来源于stack exchange,提问作者UdoQQ

