データベースに約700万行と2列を追加したいと思います。下記のコードを使用してください:PythonでSQLデータベースに追加するのにかかる時間を短縮する方法
disk_engine = create_engine('sqlite:///screen-user.db')
chunksize = 1000000
j = 0
index_start = 1
for df in pd.read_csv('C:/Users/xxx/Desktop/jjj.tsv', chunksize=chunksize, header = None, names=['screen','user'],sep='\t', iterator=True, encoding='utf-8'):
df.to_sql('data', disk_engine, if_exists='append')
count = j*chunksize
print(count)
print(j)
実際には長い時間がかかります(数日かかると思います)。これを行うより効率的な方法はありますか? Rでは、data.tableパッケージを使用して大量のデータセットをロードしていますが、1分しかかかりません。 Pythonにも同様のパッケージがありますか?接線のポイントとして、このファイルをデスクトップに物理的に格納したいと考えています。今、私は 'データ'が一時ファイルとして保存されていると仮定しています。どうすればいい?
また、データをデータベースにロードすると仮定すると、1分以内にクエリを実行する必要があります。ここで私は、Python +のSQLを使って何をしたいのかのいくつかの擬似コードは次のとおりです。
#load data(600 million rows * 2 columns) into database
#def count(screen):
#return count of distinct list of users for a given set of screens
基本的に、私はusers.Isのセットで、このタスクのためには大きすぎるデータを画面数を返すのですか?私はまた、このテーブルを別のテーブルとマージしたい。 Rのfread関数がはるかに高速な理由はありますか?
Gotchaので、SQLiteを使用しています。あなたの質問については、 "PythonがRデータテーブルに相当するのでしょうか?"パンダはその図書館です。あなたのコードの遅い部分は、データベースの書き込みです。異なるユーザを 'df'変数自体から数えることはできませんか?なぜSQLが必要ですか? –
私はデータベースがクエリを実行する方が速いと仮定しました。 Pythonの新しいユーザーとして、dfのレコードはどのように表示されますか?私がprint(df)を実行すると、オブジェクト名が取得され、SQL dbへのデータの書き込みはクエリ作成の面で簡単になり、テーブルの出力も見ることができます。また、pd.read_csvステートメントでデータをロードするのにどれくらいの時間がかかるかわかりません。 – zorny
クエリ自体をSQLに書く方がはるかに簡単ですが、発見したようにデータをデータベースに読み込むのは遅いです。個人的には、[SparkSQL](http://spark.apache.org/docs/latest/sql-programming-guide.html#overview)を参照し、後でデータベースファイルに書き込むことを心配してください。 –