我有一個6M行數據庫(sqlite)包含4個字段:id(整數)|標題(文本)|文本(文本)|標記(文本)。python計算大文件中的單詞
現在我需要計算標題中出現的每個單詞的出現次數,並將其導入到其他表格中,例如word | count和tag | word | count。
我的代碼看起來像這樣在Python 2.7:
from nltk.tokenize import wordpunct_tokenize
from collections import Counter
import sqlite3
word_count = Counter()
pair_count = Counter()
conn = sqlite3.connect('database')
c = conn.cursor()
for query in c.execute('SELECT Tags, Title FROM data'):
tags = query[0].strip().split()
title = wordpunct_tokenize(query[1])
for word in title:
word_count[word] += 1
for tag in tags:
pair_count[(tag, word)] += 1
...
的問題是,在櫃檯去如此之大,我在1M行有一個內存錯誤。我試圖每隔100K行重新初始化計數器並將計數添加到db文件,但這種方法似乎很慢,可能是由於標記字對的數量龐大。
...
for query in c.execute('SELECT Tags, Title FROM data'):
i += 1
if i % 100000 == 0:
conn1 = sqlite3.connect('counts.db')
c1 = conn1.cursor()
# update word count
for word in word_count:
c1.execute('SELECT Count FROM word_count WHERE Word=?', (word,))
count = c1.fetchone()
# add to existing count and update
if count:
count = word_count[word] + count[0]
c1.execute('UPDATE word_count SET Count=? WHERE Word=?', (count, word))
# insert new row
else:
c1.execute('INSERT INTO title_word_count VALUES (?,?)', (word, word_count[word]))
# update pair count
for pair in pair_count:
c1.execute('SELECT Count FROM pair_count WHERE Tag=? AND Word=?', pair)
count = c1.fetchone()
if count:
count = pair_count[pair] + count[0]
c1.execute('UPDATE pair_count SET Count=? WHERE Tag=? AND Word=?', (count, pair[0], pair[1]))
else:
c1.execute('INSERT INTO pair_count VALUES (?,?,?)', (pair[0], pair[1], pair_count[pair]))
conn1.commit()
conn1.close()
# reinitiate counters
word_count = Counter()
pair_count = Counter()
...
有沒有辦法可以解決這個問題,而無需訪問多臺機器?此外,任何建議的代碼將不勝感激!
編輯:
我試圖指數counts.db
和更新每個批次,但它仍然是太慢了 - 它花了10個小時,處理的每20萬行7個批次。
我按照我最初的想法結束了。但不是更新每100K行的計數,我只是將它們插入表subcounts
儘管可能重複Tag, Word
對。
Then INSERT INTO pair_count SELECT Tag, Word, SUM(Count) FROM subcounts GROUP BY Tag, Word;
給了我最後的結果。我花了大約3小時。
我不小心丟棄了臨時表,我收到了@abernert建議,但我認爲這是可行的。
感謝@Steve和@abernert爲您的建議!
只要檢查一下顯而易見的事情:你在'counts.db'中的表上有正確的索引嗎? –
@SteveJessop我不確定你的意思。 'counts.db'存儲記錄標籤計數,字數和配對計數的表格。 –
好的,在這種情況下,您可能需要研究「SQL索引」的主題。如果您沒有它們,那麼每個查詢都可能掃描整個表格,並且您每對數據執行兩個查詢。 –