簡體   English   中英

最快的子集化方法 - data.table 與 MySQL

[英]Fastest way to subset - data.table vs. MySQL

我是 R 用戶,我經常發現我需要編寫需要對大型數據集(數百萬行)進行子集化的函數。 當我將這些函數應用於大量觀察時,如果我不小心如何實現它,它會變得非常耗時。

為此,我有時會使用 data.table package,這比使用數據幀的子集提供更快的速度。 最近,我開始嘗試使用 RMySQL 之類的包,將一些表推送到 mysql,並使用 package 運行 sql 查詢並返回結果。

我發現混合的性能改進。 對於較小的數據集(數百萬),似乎將數據加載到 data.table 並設置正確的鍵有助於更快的子集。 對於較大的數據集(數十到數百萬),向 mysql 發送查詢似乎移動得更快。

想知道是否有人知道哪種技術應該更快地返回簡單的子集或聚合查詢,以及這是否應該取決於數據的大小? 我知道在 data.table 中設置鍵有點類似於創建索引,但除此之外我沒有更多的直覺。

如果數據適合 RAM,則 data.table 更快。 如果您提供一個示例,很可能很快就會發現您正在嚴重使用 data.table。 您是否閱讀過data.table wiki上的“注意事項”?

SQL 具有下限,因為它是行存儲。 如果數據適合 RAM(並且 64 位相當多),那么 data.table 更快,不僅因為它在 RAM 中,而且因為 memory 中的列是連續的(最小化從 RAM 到 L2 的頁面獲取以進行列操作)。 正確使用 data.table 應該比 SQL 的下限快。 FAQ 3.1 對此進行了解釋。 如果您看到 data.table 速度較慢,那么您使用 data.table 的可能性非常高(或者我們需要修復一個性能錯誤)。 所以,請在閱讀 data.table wiki 之后發布一些測試。

我不是 R 用戶,但我對數據庫知之甚少。 我相信 MySQL(或任何其他有信譽的 RDBMS)實際上會更快地執行您的子集操作(通常是一個數量級),除非子集過程中涉及任何額外的計算。

我懷疑您在小型數據集上的性能滯后與連接費用和將數據初始推送到 MySQL 相關。 連接開銷和數據傳輸時間可能會比 MySQL 為您節省更多的操作成本。

但是,對於大於某個最小值的數據集,這種成本似乎可以通過數據庫的絕對速度得到補償。

我的理解是 SQL 可以比代碼中的迭代操作更快地實現大多數獲取和排序操作。 但是必須考慮連接成本和(在這種情況下)通過網絡線路傳輸數據的初始成本。

我很想聽聽其他人怎么說。 . .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM