溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何利用Pandas和SQLite提升超大數(shù)據(jù)的讀取速度

發(fā)布時間:2021-11-30 15:35:26 來源:億速云 閱讀:432 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹如何利用Pandas和SQLite提升超大數(shù)據(jù)的讀取速度,文中介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們一定要看完!

第一個方法:分塊

來設(shè)想一個具體的示例:你要參加某個競選,為此,你找到了一個CSV文件,里面包含你所在城市每個選民的信息。于是乎你派人去挨門挨戶地拜訪,邀請?zhí)囟ń值赖乃械怯涍x民參與投票。

現(xiàn)在,Pandas的DataFrame對象中有索引,但是必須要將數(shù)據(jù)讀入內(nèi)存,然而CSV文件太大了,內(nèi)存無法容納,于是,你想到,可以只載入你關(guān)注的記錄。

這就是第一個方法,進(jìn)行分塊。

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文件,并且按照街道名稱進(jìn)行篩選,然后將得到記錄并為一體。

雖然逐行加載,但是關(guān)注的是比較小的子集,所以需要一些開銷。比如,對于只有70k的數(shù)據(jù)集,在我的計算機(jī)上執(zhí)行上面的函數(shù),需要574ms。2018年紐約市有460萬登記選民,挨個街道查找,需要30s。

如果我們只做一次,沒關(guān)系,如果需要反復(fù)做,這種方法并不是最佳。

創(chuàng)建索引對象

索引就是摘要,有這樣一種說法:如果你關(guān)心它,就能在這里找到大量數(shù)據(jù)。在我們的示例中,我們想根據(jù)街道名稱創(chuàng)建索引,于是就可以快速加載投票者所在的街道了。

如果你擔(dān)心索引數(shù)據(jù)也會超出內(nèi)存,那么數(shù)據(jù)庫則能作為保存它們的容器,例如PostgreSQL、MySQL等數(shù)據(jù)庫都能實現(xiàn)。哦,你不喜歡安裝和維護(hù)那些討厭的服務(wù),好吧,SQLite應(yīng)運(yùn)而生了。

SQLite是一個功能齊全的關(guān)系型數(shù)據(jù)庫,它能夠像其它數(shù)據(jù)庫一樣運(yùn)行,但是不需要服務(wù)器。Pyhton默認(rèn)就支持這種數(shù)據(jù)庫。SQLite將數(shù)據(jù)保存在獨立的文件中,你必須管理一個SQLite數(shù)據(jù)文件,而不是CSV文件了。

用SQLite存儲數(shù)據(jù)

下面演示一下如何用Pandas操作SQLite:

1. 將數(shù)據(jù)載入SQLite,并創(chuàng)建索引

SQLite數(shù)據(jù)庫能夠保存多張數(shù)據(jù)表,首先將voters.csv文件的數(shù)據(jù)載入SQLite,并保存為voters.sqlite文件,在這個文件中,我們創(chuàng)建一個名為voters的表。

接下來,在SQLite中創(chuàng)建街道的索引。

只需如下操作:

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()

雖然我們只創(chuàng)建單個索引,但我們還可以在其他列或多個列上創(chuàng)建其他索引,從而允許我們使用這些列快速搜索數(shù)據(jù)庫。

如何利用Pandas和SQLite提升超大數(shù)據(jù)的讀取速度

2. 重寫查詢函數(shù)

現(xiàn)在,所有數(shù)據(jù)都已經(jīng)載入SQLite,我們可以按照街道進(jìn)行檢索了。

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)

執(zhí)行上述函數(shù),SQLite只加載與查詢匹配的行,并其通過Pandas將它們保存為DataFrame對象。

50多倍的加速

那個CSV文件供給70,000行記錄,原來花費了574ms,現(xiàn)在只用了10ms。

提速50多倍,這是因為,只需要加載我們關(guān)心的行,而不是CSV文件中的每一行。

以上是“如何利用Pandas和SQLite提升超大數(shù)據(jù)的讀取速度”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI