gpt4 book ai didi

python - 使用 pypyodbc 和 pandas 加载 1GB .accdb 时出现内存错误

转载 作者:太空宇宙 更新时间:2023-11-03 16:23:39 25 4
gpt4 key购买 nike

我正在尝试做一些可能不可能或应该以不同方式完成的事情......

我必须读取 1 GB Access 文件并在 pandas 中操作它;由于 cursor.fetchall()Memory Error 直接失败,我尝试了下面的函数,以便查看内存错误何时发生:它出现在提取了 400.000 行之后(总共是 1.12 莫罗)。

这很奇怪,因为我的机器里有 8 GB 内存,而且它似乎是免费的 50%。我还将虚拟内存设置为 16 GB,但结果没有改变。

我不需要微积分速度,所以欢迎任何肮脏的解决方案:)包括使用硬盘作为RAM(我有一个SSD)。

也许有办法让所有内存都可用于 python?

已经失败的方法:

  • 单行获取:cursor.fetchone()
  • 多行获取:cursor.fetchmany()
  • 获取所有行:cursor.fetchall()
  • pandas read_sql 传递 chunksize:pandas.read_sql(query, conn, chunksize=chunksize)(感谢用户 MaxU)

功能:

def msaccess_to_df (abs_path, query):
conn = pypyodbc.connect(
r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
r"Dbq=" + abs_path + ";" )

cur = conn.cursor()
cur.execute( query )

fields = zip(*cur.description)[0]
df = pandas.DataFrame(columns=fields)

fetch_lines_per_block = 5000
i = 0
while True:
rows = cur.fetchmany(fetch_lines_per_block) # <-----
if len(rows) == 0: break
else:
rd = [dict(zip(fields, r)) for r in rows]
df = df.append(rd, ignore_index=True)
del rows
del rd
i+=1
print 'fetched', i*fetch_lines_per_block, 'lines'

cur.close()
conn.close()

return df

错误:

df = df.append(rd, ignore_index=True)
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 4338, in append
verify_integrity=verify_integrity)
File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 845, in concat
copy=copy)
File "C:\Python27\lib\site-packages\pandas\tools\merge.py", line 904, in __init__
obj.consolidate(inplace=True)
File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 2747, in consolidate
self._consolidate_inplace()
File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 2729, in _consolidate_inplace
self._protect_consolidate(f)
File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 2718, in _protect_consolidate
result = f()
File "C:\Python27\lib\site-packages\pandas\core\generic.py", line 2727, in f
self._data = self._data.consolidate()
File "C:\Python27\lib\site-packages\pandas\core\internals.py", line 3273, in consolidate
bm._consolidate_inplace()
File "C:\Python27\lib\site-packages\pandas\core\internals.py", line 3278, in _consolidate_inplace
self.blocks = tuple(_consolidate(self.blocks))
File "C:\Python27\lib\site-packages\pandas\core\internals.py", line 4269, in _consolidate
_can_consolidate=_can_consolidate)
File "C:\Python27\lib\site-packages\pandas\core\internals.py", line 4292, in _merge_blocks
new_values = new_values[argsort]
MemoryError

#################### 编辑 - 已解决 ####################

最后我解决了

有了这个,任何方法都可以工作。

最佳答案

我会使用原生 pandas 方法 - read_sql()而不是在循环中手动获取行:

def msaccess_to_df (abs_path, query):
conn = pypyodbc.connect(
r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
r"Dbq=" + abs_path + ";" )

df = pd.read_sql(query, conn)
conn.close()
return df

如果您仍然收到 MemoryError 异常,请尝试分块读取数据:

def msaccess_to_df (abs_path, query, chunksize=10**5):
conn = pypyodbc.connect(
r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
r"Dbq=" + abs_path + ";" )

df = pd.concat([x for x in pd.read_sql(query, conn, chunksize=chunksize)],
ignore_index=True)
conn.close()
return df

PS 这应该给你一个想法,但请注意,我没有测试这段代码,所以它可能需要一些调试......

关于python - 使用 pypyodbc 和 pandas 加载 1GB .accdb 时出现内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com