(Stata / MP 13.1)
我正在使用一组大量数据集,这些数据集需要很长时间才能加载。我目前正在循环遍历所有数据集以便每次加载它们。
是否可以告诉Stata加载每个数据集的前5个观察值(或者通常是每个使用命令中的第一个n
数据集)而不必实际加载整个数据集?否则,如果我要加载整个数据集然后只保留前5个观察结果,则该过程需要很长时间。
以下是我已经尝试过的两种解决方法
use in 1/5 using mydata
:我认为这比仅加载数据然后将所需的观察结果保存在不同的行中更有效,但我认为它仍会读取整个数据集。答案 0 :(得分:3)
我会说使用in
是在Stata中做这件事的自然方式,但测试显示
你是对的:考虑到数据集的大小,它确实没有“大”差异。一个例子是(有148,000,000个观测值)
sysuse auto, clear
expand 2000000
tempfile bigfile
save "`bigfile'", replace
clear
timer on 1
use "`bigfile'"
timer off 1
clear
timer on 2
use "`bigfile'" in 1/5
timer off 2
timer list
timer clear
导致
. timer list
1: 6.44 / 1 = 6.4400
2: 4.85 / 1 = 4.8480
我发现令人惊讶,因为in
在其他情况下似乎非常有效。
我会联系Stata Tech支持(和/或搜索,包括www.statalist.com),只是为了问为什么in
不是更快
(独立于你找到其他策略来处理这个问题)。
当然值得使用;但对于许多应用来说还不够快。
就工作流而言,您的第二个选择可能是最好的选择。在创建较小数据集时让计算机保持运行(使用 for 循环),并在完成后返回常规编码/调试。这实际上取决于你正在做什么,所以它可能有效。
答案 1 :(得分:1)
实际上,我找到了解决方案。如果你运行
use mybigdata if runiform() <= 0.0001
Stata将随机抽取0.0001的数据集而不读取整个数据集。
谢谢!
文森特
编辑:2015年4月28日(美国东部时间下午1:58) 我很抱歉。事实证明,上面实际上是不解决了原始问题。似乎在我的系统上使用速度的变化很大
use mybigdata if runiform() <= 0.0001
每次我跑的时候。当我发布以上是一个解决方案时,我认为当我运行代码时,它恰好是一个更快的实例。但是,正如我现在反复运行
use mybigdata if runiform() <= 0.0001
VS。
use in 1/5 using mydata
我实际上是找到了
use in 1/5 using mydata
平均更快。
一般来说,我的问题是如何读取Stata数据集的一部分,而不必为了计算目的而读取整个数据集,尤其是当数据集非常大时。
编辑:2015年4月28日(美国东部时间下午2:50) 总共,我有20个数据集,每个数据集的观察量在5到1,500万之间。我只需要保留8个变量(每个数据集中有58-65个变量)。以下是前四个&#34;描述,短&#34;的输出。语句。
2004 action1
Contains data from 2004action1.dta
obs: 15,039,576
vars: 64 30 Oct 2014 17:09
size: 2,827,440,288
Sorted by:
2004 action2578
Contains data from 2004action2578.dta
obs: 13,449,087
vars: 59 30 Oct 2014 17:16
size: 2,098,057,572
Sorted by:
2005 action1
Contains data from 2005action1.dta
obs: 15,638,296
vars: 65 30 Oct 2014 16:47
size: 3,143,297,496
Sorted by:
2005 action2578
Contains data from 2005action2578.dta
obs: 14,951,428
vars: 59 30 Oct 2014 17:03
size: 2,362,325,624
Sorted by:
谢谢!
文森特