有啥方法可以将大约 16GB 的 SAS 文件拆分为 Python 中的多个文件/数据帧?

Posted

技术标签:

【中文标题】有啥方法可以将大约 16GB 的 SAS 文件拆分为 Python 中的多个文件/数据帧?【英文标题】:Is there any way to split a SAS file of around 16GB into multiple files/dataframes in Python?有什么方法可以将大约 16GB 的 SAS 文件拆分为 Python 中的多个文件/数据帧? 【发布时间】:2020-05-28 06:36:30 【问题描述】:

我有一个大约 16GB 的原始 SAS 文件,即使在保留与我的问题相关的列之后,文件大小也达到大约 8GB。它看起来像这样:

CUST_ID   FIELD_1   FIELD_2   FIELD_3 ... FIELD_7
1          65         786      ABC          Y
2          87         785      GHI          N
3          88         877      YUI          Y
...
9999999    92         767      XYS          Y

当我尝试使用代码将其导入 Python 时: df=pd.read_sas(path,format='SAS7BDAT') 我的屏幕变黑了,经过多次尝试,我终于得到了错误MemoryError。 由于我的问题需要整套CUST_ID,因此只选择一个样本并删除其他行是不可能的。

我想也许我可以将整个文件拆分为多个子文件,以便我可以执行所有需要的计算,然后在完成所有必要的工作后最终将这些文件重新组合成一个大文件。

有什么办法可以解决这个问题吗?我非常感谢我能得到的所有帮助!

编辑:

我试过了

chunk_list=[]
for chunk in df_chunk 
       chunk_filter=chunk
       chunk_list.append(chunk_filter)

df_concat=pd.concat(chunk_list)

但我仍然收到Memory Error。有什么帮助吗??

【问题讨论】:

您乐于使用 SQL 吗?我很想说在传递给 python 之前清理那里的数据 您的系统有多少内存可用? 我更喜欢只涉及 python 的解决方案。有没有办法在 python 本身内清理它? 记住 SAS 将数据集保存到硬盘,而 Python 在 RAM 中运行所有操作。要运行 Pandas 工作,您需要足够的 RAM 超过数据大小。因此,即使您要读取数据,无论是否读取块,其他步骤也可能会产生 MemoryError。 *** 上的主题无关,但请考虑使用更大的机器、远程或云解决方案或虚拟环境。 确实是@Reeza。但也有可能,OP 只有.sas7bdat 文件。 【参考方案1】:

read_sas 有一个 chunksize 参数,它应该允许您将大文件分成更小的部分,以便您读取它。chunksize 是一次要读取的记录数。

【讨论】:

所以,例如,如果我想一次阅读100000 CUST_ID,我只需要输入pd.read_sas(path, chunksize=100000) ? 我要试试这个。感谢您的帮助! 所以我尝试了以下chunk_list=[] for chunk in df_chunk: chunk_list.append(chunk) 并且在循环之外,我写了df_concat=pd.concat(chunk_list) 。但我仍然收到Memory Error。有什么帮助吗?【参考方案2】:

将迭代器标志设置为 true 并在执行处理之前将文件拆分为循环。

参考:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_sas.html

或在进行输出之前在 SAS 中拆分文件。


我认为您正在尝试以下内容:

CHUNK = 10
df=pd.read_sas(path,format='SAS7BDAT',chunksize = CHUNK)

for chunk in df:
  # perform compression
  # write it out of your memory onto disk to_csv('new_file',
    # mode='a', # append mode
    # header=False, # don't rewrite the header, you need to init the file with a header
    # compression='gzip') # this is more to save space on disk maybe not needed

df=pd.read_csv(new_file)

你可以尝试压缩循环内的数据,否则合并时会再次失败:

    删除列 较低范围的数字 dtype 分类 稀疏列

参考:https://pythonspeed.com/articles/pandas-load-less-data/

【讨论】:

如何循环分割文件?抱歉,如果这是一个愚蠢的问题

以上是关于有啥方法可以将大约 16GB 的 SAS 文件拆分为 Python 中的多个文件/数据帧?的主要内容,如果未能解决你的问题,请参考以下文章

多核 gzip 解压缩,将输出文件 (csv) 拆分为 1Gb/文件

将压缩的csv拆分为块的最有效方法

有啥方法可以强制 C++ 中进程的 WorkingSet 为 1GB?

有啥方法可以尝试使用 JAVA 读取后缀为“.sas7bdat”、“.dta”、“.sav”和“.xpt”的文件?

光纤硬盘磁盘阵列sas硬盘磁盘阵列哪个好

有啥方法可以将 GraphQL 查询的多个 Fragment 扩展拆分为多个调用?