最快的方法来组合和规范化来自多个多维数组的数据

时间:2014-02-18 10:05:29

标签: python mysql arrays numpy

我有一组数据,其三维X,Y,Z为24,67,95 和8个变量:a,b,c,d,e,f,g,h

每个变量都存储在[X,Y,Z] numpy数组()中,即24 * 67 * 95 = 152760的值。

数组被组合成OrderedDict(),其中键是变量的名称。

因此,维数x,y,z的变量a的值由数据['a'] [x] [y] [z]

给出

我想以规范化格式将此数据插入MySQL表中,该格式由x,y,z索引:

 ---------------------
|x|y|z|a|b|c|d|e|f|g|h|
 ---------------------
| | | | | | | | | | | |

我是按照以下方式执行此操作的,它在x的每一步生成一个67 * 95 = 6365个条目的插入语句,我理解这是MySQL的最佳数量级:

cur = db.cursor()
Xs = 24
Ys = 67
Zs = 95    
variables = ['a','b','c','d','e','f','g','h']
for x in range(Xs):
    sql="insert into mytable (X,Y,Z"
    for variable in variables:
        sql+=","+variable
    sql+=") values"
    for y in range(Ys):
        for z in range(Zs):
            sql+="(%d,%d,%d" % (x,y,z)
            for variable in variables:
                sql+=","+str(data[variable][x][y][z])
            sql+="),"
    cur.execute(sql[:-1])

在我的四核PC上,每次循环运行整个循环大约需要24秒,执行insert语句只需要大约0.5秒。

是否有更快的方法在内存中组合和规范化这些变量?

(我知道规范化的数据库可能不是这种多维数据的最佳存储格式,这是我随后要测试的 - 为了这个问题的目的,假设它是)

谢谢!

1 个答案:

答案 0 :(得分:1)

只要查看这段代码,我认为有很多事情可以改进。这是我的看法:

cur = db.cursor()
Xs = 24
Ys = 67
Zs = 95    
variables = ['a','b','c','d','e','f','g','h']
sql = ("INSERT INTO mytable (X, Y, Z, " +
       ', '.join(variables) +
       ') VALUES ({0})').format(','.join(['%s'] * (len(variables) + 3)))

for x in range(Xs):
    for y in range(Ys):
        values = []
        for z in range(Zs):
            values = [x, y, z]
            for variable in variables:
                values.append(data[variable][x][y][z])
            cur.execute(sql, values)

SQL语句只创建一次。这些值存储在一个列表中,该列表在光标的execute()方法时传递。

您要进一步改进的是将所有值存储在列表中并使用executemany()

all_values = []
for x in range(Xs):
    for y in range(Ys):
        values = []
        for z in range(Zs):
            values = [x, y, z]
            for variable in variables:
                values.append(data[variable][x][y][z])
            all_values.append(values)

cur.executemany(sql, all_values)

我无法测试上面的内容,因为我没有测试数据,但我希望很清楚是什么改变了。