【发布时间】:2011-07-23 22:21:28
【问题描述】:
While Josh's answer here 让我在如何将 256x64x250 值数组插入 MySQL 数据库方面有了良好的开端。当我在我的数据上实际尝试他的 INSERT 语句时,结果发现速度非常慢(对于一个 16Mb 的文件来说需要 6 分钟)。
ny, nx, nz = np.shape(data)
query = """INSERT INTO `data` (frame, sensor_row, sensor_col, value) VALUES (%s, %s, %s, %s)"""
for frames in range(nz):
for rows in range(ny):
for cols in range(nx):
cursor.execute(query, (frames, rows, cols, data[rows,cols,frames]))
我正在阅读MySQL for Python,它解释说这不是正确的方法,因为执行 400 万个单独的插入非常低效。
现在我的数据包含很多零(实际上超过 90%),所以我输入了一个 IF 语句,所以我只插入大于零的值,我使用了 executemany() :
query = """INSERT INTO `data` (frame, sensor_row, sensor_col, value) VALUES (%s, %s, %s, %s ) """
values = []
for frames in range(nz):
for rows in range(ny):
for cols in range(nx):
if data[rows,cols,frames] > 0.0:
values.append((frames, rows, cols, data[rows,cols,frames]))
cur.executemany(query, values)
这奇迹般地将我的处理时间缩短到 20 秒左右,其中 14 秒用于创建 值 列表(37k 行),4 秒用于实际插入数据库。
所以现在我想知道,我怎样才能进一步加快这个过程?因为我觉得我的循环效率非常低,必须有更好的方法。如果我需要为每只狗插入 30 个测量值,这仍然需要 10 分钟,这对于这么多数据来说似乎太长了。
这是我的原始文件的两个版本:with headers 或 without headers。我很想试试 LOAD DATA INFILE,但我不知道如何正确解析数据。
【问题讨论】:
-
数据从何而来?
-
这是一个大文本文件,每个“框架”上方都有一些标题,您具体想知道什么?
-
我只是好奇这个耗时的过程是读取文件还是嵌套的 for 循环来创建查询。
-
什么是
data?也许你可以通过在data上应用一些函数来获得values?这可以大大加快速度。 -
@alp & @pajton: data 是一个 numpy 数组,它加载在内存中,所以我猜它来自嵌套循环。如果有另一种方法来检索所有非零值及其索引,那么我会全力以赴