2017-05-09 25 views
4

CSVからのデータ読み込みは、PandasのSQL(Postgre SQL)より高速です。 (私はSSDを有する)ここPandasはSQLよりもCSVを読み込む方が速い

は私のテストコードである:

import pandas as pd 
import numpy as np 

start = time.time() 
df = pd.read_csv('foo.csv') 
df *= 3 
duration = time.time() - start 
print('{0}s'.format(duration)) 

engine = create_engine('postgresql://user:[email protected]:port/schema') 
start = time.time() 
df = pd.read_sql_query("select * from mytable", engine) 
df *= 3 
duration = time.time() - start 
print('{0}s'.format(duration)) 

foo.csvとデータベースの両方のデータと同じ列(同量、4列、完全な100 000行ですランダムintの)。

CSVは0.05s

SQLは0.5秒

を取る取るあなたはそれがCSVは10時間速くSQLよりであることを普通のことだと思いますか?私はここで何かが欠けていた場合、私はcsvファイルを読むことは常に単にデータ

CSVは非常にナイーブで簡単ですをロードする最も簡単な方法の一つであり、これは正常な動作です...

+0

はい。正常.... –

+0

ありがとう、私は本当にSQLが高速だったけれども、私は本当に – Haelle

答えて

3

を思ったんだけど。それから直接ロードするのは非常に簡単です。複雑な構造の大規模なデータベースの場合、CSVはオプションではありません。 SQLは、テーブルからデータを選択してそのデータを返す超高速です。もちろん、データを選択、変更、操作することができれば、オーバヘッド時間のコストがかかります。

csvで1920年から2017年までのcsvに時系列がありますが、2010年から今日までのデータのみが必要であるとします。 SQLセレクト機能を経由して年を事前に選択することであろう

CSVアプローチは、全体のCSVが、その後2017年

SQLアプローチに年間2010を選択読み込むことであろう

このシナリオでは、SQLは非常に高速になります。

+1

少しこれを詳しく教えていただけますか?なぜデータをリレーショナルデータベースから取り出すよりも速くCSVを読み込むのですか? – Vame

+0

@Vame CSVはとても素朴でシンプルです。それから直接ロードするのはすばやく簡単です。あなたはそれを読み込むときに実際にcsvの特定の行だけを選択することはできません。複雑な構造を持つ大規模なデータベースの場合、CSVはオプションではありません。 SQLは、テーブルからデータを選択してそのデータを返す超高速です。もちろん、データを選択、変更、操作することができれば、オーバーヘッドの時間コストがかかります。答えの例 –

+0

@StevenG Haelleはこのタイプの質問でかなり多くのことを行うことができるPandasを使用しています。コールはdf [(df.year> = 2010)&(df.year <= 2017)]です。これらの2つのタイミングの比較を見たいと思います。 「開始するにはRAMにロードされていますか」を考慮してください。 – Back2Basics

0

それはあなたが同じことのためにそれらを使用することができていても、CSVは、SQLよりもはるかに高速であることを完全に正常だが、それらは同じもののためのものではありません。

  1. CSVは、シーケンシャルアクセスのためでありますつまり、ファイルの先頭から開始し、必要に応じて各行を順番に読み取って処理します。

  2. SQLは索引アクセス用です。つまり、索引を参照して、探している行に移動します。フル・テーブル・スキャンを実行することもできます。つまり、インデックスを使用しないでください。これにより、テーブルが本質的に膨大なCSVになります。

クエリは完全なテーブルスキャンであり、インデックスを参照しません。すべてのデータに適用されるため、正常です。あなたは

select * from mytable where myindex = "myvalue"; 

のようなクエリを試す場合は、CSV内の同じ行の検索に比べて大きな後押しを得ることができます一方

、。それはSQLのインデックスのためです

関連する問題