python C 如何提高INSERT语句的性能?
ny,nx,n
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)""" for frames in range(nz): for rows in range(ny): for cols in range(nx): cursor.execute(query,(frames,rows,cols,data[rows,frames])) 我正在阅读MySQL for Python,它解释说这不是正确的方法,因为执行400万个单独的插入是非常低效的. 现在我的数据由很多零组成(实际超过90%),所以我抛出一个IF语句,所以我只插入大于零的值,而我使用executemany()代替: query = """INSERT INTO `data` (frame,%s ) """ values = [] for frames in range(nz): for rows in range(ny): for cols in range(nx): if data[rows,frames] > 0.0: values.append((frames,frames])) cur.executemany(query,values)这奇迹般地将我的处理时间缩短到大约20秒,其中14秒花费在创建值列表(37k行)和实际插入数据库4秒. 所以现在我想知道,我怎样才能进一步加快这个过程?因为我有一种感觉,我的循环非常低效,必须有更好的方法.如果我需要为每只狗插入30个测量值,这仍然需要10分钟,这对于这个数据量来说似乎太长了. 以下是我的原始文件的两个版本:with headers或without headers.我想尝试LOAD DATA INFILE,但我无法弄清楚如何正确解析数据. 解决方法 如果数据是一个numpy数组,你可以试试这个: query = """INSERT INTO `data` (frame,%s ) """ values = [] rows,frames = numpy.nonzero(data) for row,col,frame in zip(rows,frames): values.append((frame,row,data[row,frame])) cur.executemany(query,values)要么 query = """INSERT INTO `data` (frame,%s ) """ rows,frames = numpy.nonzero(data) values = [(row,frame,val) for row,val in zip(rows,frames,frames])] cur.executemany(query,values)希望能帮助到你 (编辑:甘南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 总结python多进程multiprocessing的相关知识
- python – Matplotlib显示多个图像与for循环
- Python – 通过偶数或奇数索引将列表拆分为2?
- python实现简单的聊天小程序
- Python-redis keys()返回字节对象列表而不是字符串
- python – OS X UDP发送错误:55没有可用的缓冲区空间
- python – 从py2exe’d程序连接到Oracle时出错:无法获取Or
- python – Django – 显示ImageField
- python-2.7 – 无法安装PythonMagick Windows 7
- python – 改变Kivy中Button的背景颜色