我正在尝试做一些可能不可能或应该以不同方式完成的事情......
我必须读取一个 1 GB 的 Access 文件并在 pandas 中操作它;由于cursor.fetchall()
直接失败Memory Error
,我尝试了下面的函数以查看内存错误何时发生:它出现在 400.000 行获取后(总数为 1.12 Mrows)。
这很奇怪,因为我的机器中有 8 GB 内存,而且它似乎是 50% 的免费内存。我还将我的虚拟内存设置为 16 GB,但结果没有改变。
我不需要微积分速度,所以欢迎任何肮脏的解决方案:) 包括使用硬盘作为 ram(我有一个 ssd)。
也许有一种方法可以让所有内存都可用于 python?
已经失败的方法:
- 单行获取:
cursor.fetchone()
- 许多行获取:
cursor.fetchmany()
- 所有行获取:
cursor.fetchall()
- 熊猫
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
#################### 编辑 - 已解决####################
最后我解决了
- 将机器虚拟内存设置为 16GB
- 安装 Python 64 位
- 用 64 位驱动程序替换 Access 驱动程序 ( https://www.microsoft.com/en-us/download/confirmation.aspx?id=13255 )
有了这个,任何方法都有效。