2017-05-07 2 views
0

〜147m行を書く必要があります。sqlite3のインデックスとRAM

conn = sqlite3.connect('db.db') 
cur = conn.cursor() 
cur.execute('''CREATE TABLE IF NOT EXISTS NodesRefStop (stop_id text, stop_lat text, stop_lon text, 
       stop_id_ref text, stop_lat_ref text, stop_lon_ref text, stop_type_ref text, distance REAL)''') 
cur.execute('PRAGMA synchronous = 0') 
conn.commit() 

をしかし、私は、インデックスを追加するとSQLiteはすべて私のRAMを食べる:私は、インデックスなしで私のDBを設定した場合、すべてがうまく動作し

conn = sqlite3.connect('db.db') 
cur = conn.cursor() 
cur.execute('''CREATE TABLE IF NOT EXISTS NodesRefStop (stop_id text, stop_lat text, stop_lon text, 
       stop_id_ref text, stop_lat_ref text, stop_lon_ref text, stop_type_ref text, distance REAL)''') 
cur.execute("CREATE INDEX dist_index ON NodesRefStop (distance);") 
cur.execute("CREATE INDEX stop_id_index ON NodesRefStop (stop_id);") 
cur.execute('PRAGMA synchronous = 0') 
conn.commit() 

私は何をすべきでしょうか?

答えて

-1

私はこの問題を経験したことはありませんが、私は好奇心が強いですし、少し調べました。明らかにそれは既知の問題です。ここで

http://sqlite.1065341.n5.nabble.com/Index-memory-usage-in-SQLite-td41624.html

sqliteの最適化についての興味深い記事: https://katastrophos.net/andre/blog/2007/01/04/sqlite-performance-tuning-and-optimization-on-embedded-systems/

「静的なデータのみまたはめったに変化しないデータにインデックスを使用してみてくださいライブまたは一時的なデータにインデックスを構築することは、高価なパフォーマンスすることができます。 "...それはsqliteだけでなく、すべてのデータベースで真です。

最初にすべての行を挿入した後、データが頻繁に変更されない場合は、最後にインデックスを追加しようとする可能性があります。すべての行を1つのトランザクションに挿入しますか?たぶんあなたはチャンクでそれをすることができます。

+0

あなたのリンクから関連情報を回答本体に含めてください。サードパーティのサイトへのリンクは、ページの移動やサイトのダウンに伴って中断することがあります。 –

+0

@ColonelThirtyThoありがとう、あなたは正しいです。私はちょうどユーザーに関連情報といくつかの一般的なアドバイスを提供したいと思っています。これらの記事から情報を抽出するのは難しいでしょう。彼は答えを受け入れたので、彼にとっては十分だったと思います。 –