我目前正在使用非常大的数据集(10个变量,超过300米行)的10%样本,当以完整数据集的.dta格式存储时,相当于超过200 GB的数据。在具有~50G RAM和多个内核的UNIX服务器上使用Stata-MP时,Stata能够在合理的时间内为10%样本处理egen,崩溃,合并等操作。
然而,现在我想继续分析整个样本。即使我使用具有足够RAM来容纳数据集的机器,简单地生成变量也需要很长时间。 (我想也许后台操作会导致Stata遇到虚拟内存)
该问题也非常适合并行化,即数据集中的行彼此独立,因此我可以轻松地将一个大型数据集视为100个较小的数据集。
有人对如何处理/分析这些数据有什么建议,还是可以就我目前的一些建议给出反馈?我主要使用Stata / SAS / MATLAB,所以也许还有其他我根本不知道的方法。
以下是我目前的一些想法:
将数据集拆分为较小的数据集,并在Stata中使用非正式并行处理。我可以在每个分区上运行清理/处理/分析,然后在没有存储所有中间部分的情况下合并结果。
使用SQL存储数据并执行某些数据操作,例如聚合某些值。这里的一个问题是,Stata可以相当容易地处理的一些任务(例如跨时间比较值)在SQL中不能很好地工作。此外,在30%的数据样本上运行SQL中的一些查询时,我已经遇到了性能问题。但也许我没有通过正确索引来优化等等。另外,Shard-Query似乎可以帮助解决这个问题,但我还没有彻底研究它。
R也看起来很有希望,但我不确定它是否能解决使用这些大量数据的问题。
答案 0 :(得分:2)
感谢那些评论和回复的人。我意识到我的问题类似于thread。我已将Stata中的一些数据操作代码重写为SQL,响应时间更快。我相信通过正确使用索引并在必要时通过分区/分片使用并行处理,我可以获得大的优化收益。完成所有数据操作后,我可以通过ODBC在Stata中导入该数据。
答案 1 :(得分:1)
由于您熟悉Stata,因此Stata Dealing with Large Datasets中有大量关于大型数据集的常见问题解答:您可能会觉得这很有帮助。
我会通过列清除它们,将它们分开,运行任何特定的清理程序,然后再运行merge
。
根据您的计算机资源,您应该能够使用tempfile
将各列保存在多个临时文件中。注意只选择与分析最相关的变量或列应该会大大减少集合的大小。