SEC Edgar Logfile数据库快速下载与大容量结果存储方案咨询
下载与解压优化方案
- 下载环节改用流式请求,避免将整个压缩包加载到内存,批量任务可搭配异步请求框架提升下载速度
- 读取文件时启用分块加载,仅读取需要的字段并指定更紧凑的数据类型,降低内存占用
- 可替换pandas为polars库,其默认内存管理和运行效率优于pandas,还支持懒加载无需全量读入数据
优化后代码示例:
import pandas as pd import requests import zipfile import tempfile def get_df_chunked(url, chunk_size=100000, usecols=None, dtype=None): # 流式下载到临时文件,不占用内存存储整个压缩包 with requests.get(url, stream=True) as r: r.raise_for_status() with tempfile.NamedTemporaryFile(suffix='.zip') as tmp: for chunk in r.iter_content(chunk_size=8192): tmp.write(chunk) tmp.flush() # 读取压缩包内csv,分块返回处理 with zipfile.ZipFile(tmp.name) as zip_file: csv_name = zip_file.namelist()[0] with zip_file.open(csv_name) as f: for chunk in pd.read_csv(f, chunksize=chunk_size, usecols=usecols, dtype=dtype): yield chunk
调用时可按需指定需要的列和数据类型,进一步压缩内存占用:
# 示例:仅读取ip、cik、accession三个必要字段,指定数据类型减少冗余内存占用 for chunk in get_df_chunked( url='http://www.sec.gov/dera/data/Public-EDGAR-log-file-data/2017/Qtr2/log20170630.zip', usecols=['ip', 'cik', 'accession'], dtype={'ip': 'string', 'cik': 'Int32'} ): # 逐块执行IP匹配、分组计算等操作 process_chunk(chunk)
处理结果存储方案
- 不建议存储为CSV格式,优先选择Parquet列式存储格式,相比CSV可节省70%以上存储空间,读写速度提升数倍,且支持按字段查询,pandas、polars、DuckDB等工具均可直接读写
- 全量数据查询分析可搭配DuckDB嵌入式数据库,无需导入数据即可直接对Parquet文件执行SQL查询,分组、关联匹配等操作效率远高于pandas内存计算,且支持超出内存规模的数据运算
- 若需要多用户访问或高频查询,可将结果导入PostgreSQL数据库,给常用查询字段(如IP段、企业ID)增加索引,大幅提升查询效率
内容的提问来源于stack exchange,提问作者Jim Knopf
相关产品推荐
相关产品推荐

