一、大批量插入數(shù)據(jù)
對于 大量數(shù)據(jù)插入時,雖然pyDAL也手冊中有個方法:bulk_insert(),但是手冊也說了,雖然方法上是一次可以多條數(shù)據(jù),如果后端數(shù)據(jù)庫是關系型數(shù)據(jù)庫,他轉(zhuǎn)換為SQL時它是一條一條的插入的,只有在NoSQL數(shù)據(jù)庫時能提速,bulk_insert()的用法如下,感興趣的看看:
db.person.bulk_insert([{'name':'Alex','age':'11'},
???????????????????????{'name': 'John','age':'22'},
? {'name': 'Tim','age':'33'}])
那后端是關系數(shù)據(jù)庫時,有其他辦法嗎?答案是我們利用前面 我們提到:db.executesql()方法,直接用SQL,下面是例子,
1、目標:
MySQL數(shù)據(jù)庫我們一次插入2000萬的csv文件(普通PC是無法直接打開這么多行的數(shù)據(jù)文件的)
2、解決思路:
(1)分塊讀取,分塊插入,我們已知csv各列的名為:col1,col2,col3,我們每次讀10萬行,插入庫10萬行);
(2)使用db.executesql()方法,編寫SQL批量插入語句
(3)特別注意:將你的數(shù)據(jù)庫的單條語句的數(shù)據(jù)包大小適當調(diào)大。就mysql而言:
# 服務器接受的數(shù)據(jù)包的大小,在執(zhí)行數(shù)據(jù)量較大的單條語句,如果超過了默認限制,就會報錯,提示這個參數(shù)大小不足
max_allowed_packet=100M
3、MySQL批量插入數(shù)據(jù)語法:
INSERT INTO table_name (column1, column2,...) VALUES ("value1_1", "value1_2",...), ("value2_1", "value2_2", ...)......;
4、示例代碼:
我們使用到了pandas庫,pandas的read_csv()方法可以對非常方便的對大文件分塊讀?。?/strong>
import pandas as pd
df_chunk = pd.read_csv('my.csv', chunksize=100000, iterator=True)
for chunk in df_chunk:
??? insert_values = ''
??? for row in range(0, chunk.shape[0]):
??????? insert_values += '("' + str(chunk.iloc[row,0]) + '","' + str(chunk.iloc[row,1]) + '","' + str(chunk.iloc[row,2]) + '"),'
??? db.executesql('INSERT INTO my_table (col1,col2,col3) VALUES ' + insert_values[:- 1] + ';')
??? db.commit()
二、對于結(jié)果集很大的查詢做遍歷循環(huán)iterselect
? ? ?如果我們要對一個查詢結(jié)果集做遍歷循環(huán),且結(jié)果數(shù)據(jù)很大,例如:
for row in db(db.IMEI_table.IMEI.contains('666')).select():
.....
常規(guī)的上述寫法,一定是先查詢得到 完整的結(jié)果放在內(nèi)存中,在做遍歷循環(huán),很吃內(nèi)存,性能也低,針對這種情況,pyDAL提供了iterselect()方法,使用也很方便,如下:
for row in db(db.IMEI_table.IMEI.contains('666')).iterselect():
????? ...文章來源:http://www.zghlxwxcb.cn/news/detail-804809.html
當數(shù)據(jù)量較大時,iterselect()不僅速度快,還節(jié)省內(nèi)存:文章來源地址http://www.zghlxwxcb.cn/news/detail-804809.html
到了這里,關于pyDAL一個python的ORM(終) pyDAL的一些性能優(yōu)化的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!