我遇到Python脚本问题,基本上只是逐行分析CSV文件,然后使用FOR循环将每一行插入MySQL表:
f = csv.reader(open(filePath, "r"))
i = 1
for line in f:
if (i > skipLines):
vals = nullify(line)
try:
cursor.execute(query, vals)
except TypeError:
sys.exc_clear()
i += 1
return
查询的格式为:
query = ("insert into %s" % tableName) + (" values (%s)" % placeholders)
这对于它所使用的每个文件都有效,只有一个例外 - 最大的文件。它每次都停在不同的点 - 有时达到600,000条记录,有时达到900,000条记录。但总共有大约4,000,000条记录。
我无法弄清楚为什么会这样做。表类型是MyISAM。有足够的磁盘空间。该表停止时达到约35MB。 max_allowed_packet
设置为16MB,但我不认为这是一个问题,因为它是逐行执行的?
任何人都有任何想法可能是什么?不确定是负责这个的Python,MySQL还是MySQLdb模块。
提前致谢。
答案 0 :(得分:1)
您是否尝试过LOAD
MySQL功能?
query = "LOAD DATA INFILE '/path/to/file' INTO TABLE atable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\'"
cursor.execute( query )
您始终可以预处理CSV文件(至少我正在做的事情:)
值得尝试的另一件事是批量插入。您可以尝试使用一个查询插入多行:
INSERT INTO x (a,b)
VALUES
('1', 'one'),
('2', 'two'),
('3', 'three')
哦,是的,你不需要提交,因为它是MyISAM引擎。
答案 1 :(得分:0)
正如S. Lott所暗示的,不是用作交易句柄的游标吗?
因此,db在任何时候都可以选择回滚所有挂起的插入。
您可能只是为一个事务插入了太多插件。尝试每隔几千次插入提交事务。