您好,登錄后才能下訂單哦!
這篇文章主要介紹如何利用Pandas和SQLite提升超大數據的讀取速度,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
來設想一個具體的示例:你要參加某個競選,為此,你找到了一個CSV文件,里面包含你所在城市每個選民的信息。于是乎你派人去挨門挨戶地拜訪,邀請特定街道的所有登記選民參與投票。
現在,Pandas的DataFrame對象中有索引,但是必須要將數據讀入內存,然而CSV文件太大了,內存無法容納,于是,你想到,可以只載入你關注的記錄。
這就是第一個方法,進行分塊。
import pandas as pd def get_voters_on_street(name): return pd.concat( df[df["street"] == name] for df in pd.read_csv("voters.csv", chunksize=1000) )
以分塊的方式加載CSV文件,并且按照街道名稱進行篩選,然后將得到記錄并為一體。
雖然逐行加載,但是關注的是比較小的子集,所以需要一些開銷。比如,對于只有70k的數據集,在我的計算機上執行上面的函數,需要574ms。2018年紐約市有460萬登記選民,挨個街道查找,需要30s。
如果我們只做一次,沒關系,如果需要反復做,這種方法并不是最佳。
索引就是摘要,有這樣一種說法:如果你關心它,就能在這里找到大量數據。在我們的示例中,我們想根據街道名稱創建索引,于是就可以快速加載投票者所在的街道了。
如果你擔心索引數據也會超出內存,那么數據庫則能作為保存它們的容器,例如PostgreSQL、MySQL等數據庫都能實現。哦,你不喜歡安裝和維護那些討厭的服務,好吧,SQLite應運而生了。
SQLite是一個功能齊全的關系型數據庫,它能夠像其它數據庫一樣運行,但是不需要服務器。Pyhton默認就支持這種數據庫。SQLite將數據保存在獨立的文件中,你必須管理一個SQLite數據文件,而不是CSV文件了。
下面演示一下如何用Pandas操作SQLite:
1. 將數據載入SQLite,并創建索引
SQLite數據庫能夠保存多張數據表,首先將voters.csv文件的數據載入SQLite,并保存為voters.sqlite文件,在這個文件中,我們創建一個名為voters的表。
接下來,在SQLite中創建街道的索引。
只需如下操作:
import sqlite3 # Create a new database file: db = sqlite3.connect("voters.sqlite") # Load the CSV in chunks: for c in pd.read_csv("voters.csv", chunksize=1000): # Append all rows to a new database table, which # we name 'voters': c.to_sql("voters", db, if_exists="append") # Add an index on the 'street' column: db.execute("CREATE INDEX street ON voters(street)") db.close()
雖然我們只創建單個索引,但我們還可以在其他列或多個列上創建其他索引,從而允許我們使用這些列快速搜索數據庫。
2. 重寫查詢函數
現在,所有數據都已經載入SQLite,我們可以按照街道進行檢索了。
def get_voters_for_street(street_name): conn = sqlite3.connect("voters.sqlite") q = "SELECT * FROM voters WHERE street = ?" values = (street_name,) return pd.read_sql_query(q, conn, values)
執行上述函數,SQLite只加載與查詢匹配的行,并其通過Pandas將它們保存為DataFrame對象。
50多倍的加速
那個CSV文件供給70,000行記錄,原來花費了574ms,現在只用了10ms。
提速50多倍,這是因為,只需要加載我們關心的行,而不是CSV文件中的每一行。
以上是“如何利用Pandas和SQLite提升超大數據的讀取速度”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。