我正在使用大约3.3千兆字节的Stata .dta文件,因此它很大但不会过大。我有兴趣使用IPython并尝试使用Pandas导入.dta文件,但是有些事情正在发生。我的盒子有32千兆字节的RAM,并试图加载.dta文件导致所有使用的RAM(约30分钟后)和我的计算机停止运行。这不是'感觉'正确,因为我能够使用外部包中的read.dta()打开R中的文件没有问题,并且使用Stata中的文件很好。我正在使用的代码是:
%time myfile = pd.read_stata(data_dir + 'my_dta_file.dta')
我正在使用Enthought的Canopy程序中的IPython。 '%time'的原因是因为我有兴趣对R的read.dta()进行基准测试。
我的问题是:
答案 0 :(得分:7)
这是一个对我来说很方便的功能,使用了一些pandas
功能,这些功能在最初提出问题时可能无法使用:
def load_large_dta(fname):
import sys
reader = pd.read_stata(fname, iterator=True)
df = pd.DataFrame()
try:
chunk = reader.get_chunk(100*1000)
while len(chunk) > 0:
df = df.append(chunk, ignore_index=True)
chunk = reader.get_chunk(100*1000)
print '.',
sys.stdout.flush()
except (StopIteration, KeyboardInterrupt):
pass
print '\nloaded {} rows'.format(len(df))
return df
我在100分钟内加载了一个11G Stata文件,如果我厌倦了等待并点击cntl-c
,那么可以玩一些东西。
答案 1 :(得分:3)
对于在此页面结尾的所有人,请将Pandas升级到最新版本。在加载期间,我遇到了一个停滞计算机的确切问题(300 MB Stata文件,但只有8 GB系统ram),从v0.14升级到v0.16.2很快解决了这个问题。
目前,它是0.16.2。虽然我不知道具体细节,但速度有了显着的提高。请参阅:most efficient I/O setup between Stata and Python (Pandas)
答案 2 :(得分:1)
使用Pandas的内置函数read_stata
可以解决此问题。
假设您的大文件名为large.dta
。
import pandas as pd
reader=pd.read_stata("large.dta",chunksize=100000)
df = pd.DataFrame()
for itm in reader:
df=df.append(itm)
df.to_csv("large.csv")
答案 3 :(得分:0)
问题1。
关于这一点我没说太多。
问题2。
考虑使用Stata命令.dta
或.csv
将您的outsheet
文件导出到export delimited
,然后在pandas中使用read_csv()
。实际上,您可以使用新创建的.csv
文件,将其用作R的输入并与pandas进行比较(如果感兴趣的话)。 read_csv
可能比read_stata
有更多的测试。
运行help outsheet
了解导出的详细信息。
答案 4 :(得分:-3)
你不应该将3GB +文件读入内存中的数据对象,这是一个灾难的处方(与熊猫无关)。 正确的方法是mem-map文件并根据需要访问数据。
您应该考虑将文件转换为更合适的格式(csv
或hdf
),然后您可以使用pandas DataFrame周围的Dask包装器根据需要对数据进行块加载:
from dask import dataframe as dd
# If you don't want to use all the columns, make a selection
columns = ['column1', 'column2']
data = dd.read_csv('your_file.csv', use_columns=columns)
这将透明地处理块加载,多核数据处理和所有这些。