pandas 如何在python中读取34Gb stata(.dta)文件

ffvjumwh  于 2023-03-16  发布在  Python
关注(0)|答案(2)|浏览(405)

我试图读取一个34Gb的Stata(.dta)文件,但不断得到一个“MemoryError”消息,很明显,我的16Gb内存是不够的。
我尝试测试一个11Mb的Stata文件:

dtafile = 'E:/test file.dta'
df = pd.read_stata(dtafile)
a = df.head()
print(a)

我得到的正确输出为:

app_id    inventor_id  ...  lagged_generality_FYnormalized       _merge
0  101985                 ...                        1.038381  matched (3)
1  102019  SCHOTTEK 2827  ...                        0.830110  matched (3)
2  102019  KUELLMER 2827  ...                        0.830110  matched (3)
3  102019   DICKNER 2827  ...                        0.830110  matched (3)
4  102562    VINEGAR 986  ...                        0.825088  matched (3)

[5 rows x 1448 columns]

Process finished with exit code 0

但是当我用34GB文件尝试同样的操作时,我得到了一个“MemoryError”消息。完整的错误消息是:

Traceback (most recent call last):
  File "C:\Users\Gaju\PycharmProjects\first project\work.py", line 8, in <module>
    df = pd.read_stata(dtafile)
  File "C:\Users\Gaju\PycharmProjects\first project\venv\lib\site-packages\pandas\util\_decorators.py", line 317, in wrapper
    return func(*args, **kwargs)
  File "C:\Users\Gaju\PycharmProjects\first project\venv\lib\site-packages\pandas\io\stata.py", line 2021, in read_stata
    reader = StataReader(
  File "C:\Users\Gaju\PycharmProjects\first project\venv\lib\site-packages\pandas\io\stata.py", line 1172, in __init__
    self.path_or_buf = BytesIO(handles.handle.read())
MemoryError

Process finished with exit code 1
pcww981p

pcww981p1#

从表面上看,Pandas的Stata解析器目前总是将整个文件读入内存(并将其转换为内存流)。
这显然是一种倒退--如果我正确地阅读this diff,那么解析器以前只能使用来自磁盘的文件流。

**EDIT:**无独有偶,最近有人提出了一个关于这个的bug报告:https://github.com/pandas-dev/pandas/issues/48700
**编辑2:**我想我也可以尝试修复这个问题。https://github.com/pandas-dev/pandas/pull/48922
**编辑3:**一年后的一个季度,我的PR被合并到Pandas2.0中。

cczfrluj

cczfrluj2#

有几个库可以与panda无缝地工作(即允许您使用传统的panda API),但针对大文件进行了优化
这是一个link
此外,如果你不想读这篇文章,只是尝试

# pip install "modin[dask]"
import modin.pandas as pd

相关问题