我有一组数据,其三维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秒。
是否有更快的方法在内存中组合和规范化这些变量?
(我知道规范化的数据库可能不是这种多维数据的最佳存储格式,这是我随后要测试的 - 为了这个问题的目的,假设它是)
谢谢!
答案 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)
我无法测试上面的内容,因为我没有测试数据,但我希望很清楚是什么改变了。