gpt4 book ai didi

python - 通过 Pandas 将 CSV 插入 SQLITE : How to avoid the Memory Error?

转载 作者:行者123 更新时间:2023-12-02 02:58:28 25 4
gpt4 key购买 nike

尝试将 pandas 数据帧从 CSV 写入 SQLITE 数据库时遇到内存错误。CSV 文件有 430 MB 和 6 000 000 行。

对于较小的文件,它绝对可以正常工作。但是我想知道如何避免较大文件的内存错误。

按 block 读取工作正常,并正确打印 20 000 行 block 中的 6 000 000 行。然而脚本想要将整个 6 000 000 行传输到 SQLITE 数据库+表中,并给出以下错误:

Traceback (most recent call last):
File "C:/SQLITELOAD1.py", line 42, in <module>
.rename(columns=dict(zip(big_data.columns, listofcol)))
File "C:\Python37\site-packages\pandas\util\_decorators.py", line 197, in wrapper
return func(*args, **kwargs)
File "C:\Python37\site-packages\pandas\core\frame.py", line 4025, in rename
return super(DataFrame, self).rename(**kwargs)
File "C:\Python37\site-packages\pandas\core\generic.py", line 1091, in rename
level=level)
File "C:\Python37\site-packages\pandas\core\internals\managers.py", line 170, in rename_axis
obj = self.copy(deep=copy)
File "C:\Python37\site-packages\pandas\core\internals\managers.py", line 734, in copy
do_integrity_check=False)
File "C:\Python37\site-packages\pandas\core\internals\managers.py", line 395, in apply
applied = getattr(b, f)(**kwargs)
File "C:\Python37\site-packages\pandas\core\internals\blocks.py", line 753, in copy
values = values.copy()
MemoryError

代码:

import csv, sqlite3, time, os, ctypes
from sqlalchemy import create_engine
import pandas as pd
datab = 'NORTHWIND'
con=sqlite3.connect(datab+'.db')
con.text_factory = str
cur = con.cursor()
koko = 'C:\\NORTHWIND'
print(koko)
directory = koko
print(directory)

for file in os.listdir(directory):
for searchfile, listofcol, table in zip(['1251_FINAL.csv'],
[['SYS', 'MANDT', 'AGR_NAME', 'OBJECT', 'AUTH', 'FIELD', 'LOW', 'HIGH', 'DELETED']],
['AGR_1251_ALL2']):

if file.endswith(searchfile):

fileinsert = directory + '\\' + searchfile
my_list = []
for chunk in pd.read_csv(fileinsert, sep=",",error_bad_lines=False, encoding='latin-1', low_memory=False, chunksize=20000):
my_list.append(chunk)
print(chunk)
big_data = pd.concat(my_list, axis = 0)
print(big_data)
del my_list
(big_data
.rename(columns=dict(zip(big_data.columns, listofcol)))
.to_sql(name=table,
con=con,
if_exists="replace",
chunksize=20000,
index=False,
index_label=None))

最佳答案

当您在 SQL 数据库中插入记录时,需要考虑两种大小:

  • 单个INSERT的大小
  • 连续COMMIT之间的全局大小

因为在提交一堆请求之前,数据库必须能够回滚所有内容,因此不会明确写入任何内容。

对于症状的描述,我可以猜测 to_sql 使用 chunksize 参数作为 INSERT 上的大小,但在整个操作终止时使用单个 COMMIT .

没有直接的修复方法,但在数据库中加载大型记录集时的常见方法是使用中间 COMMIT 请求来允许在数据库中进行一些清理。换句话说,每个 block 应该使用一个 to_sql。它迫使您在循环之前明确删除表,使用 if_exists="append" 并准备好在出现问题时清理所有内容,但我不知道更好的方法...

关于python - 通过 Pandas 将 CSV 插入 SQLITE : How to avoid the Memory Error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60563856/

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