2012-03-11 60 views
-2

我存儲如下到一個文件形式的值:Python中有更快的查找方法,文件操作速度較慢?

143 800 'Ask' 
213 457 'Comment' 
424 800 'Hi' 

第一列這裏包含了獨特的元素。 但是,當我將它存儲爲文件格式時,查看第一列的值是非常低效的,在Python中是否有更快捷的查找方法更有效。 我知道python中的詞典來完成這個,但我正在尋找其他方法。由於數據中有數萬億條記錄......因此我無法將它們保存在RAM中的字典中。因此,我正在尋找其他方法。 還與每個程序exection行要在數據庫的情況下被插入,怎麼什麼,我在數據庫弄不清在下面給出克服的一個例子:

143 800 'Ask' 
213 457 'Comment' 
424 800 'Hi' 
143 800 'Ask' 
213 457 'Comment' 
424 800 'Hi' 
+2

「文件格式」並不是您現在正在做什麼的非常具體的描述。任何可以創建索引的數據庫都將提供相對快速的查找(取決於您要存儲的數百萬條記錄)。 – 2012-03-11 14:32:27

+0

@LarryLustig我正在尋找一種pythonic方式來完成相同的操作,雖然我知道字典...但我正在尋找其他方法來完成相同的操作。感謝您的幫助 – 2012-03-11 14:37:20

回答

2

下面是使用sqlite3的完整代碼示例,演示瞭如何初始化數據庫,將數據放入數據庫並獲取單行數據。

import sqlite3 

conn = sqlite3.connect(':memory:') 
conn.execute("""CREATE TABLE Widget (id INTEGER PRIMARY KEY, 
            serial_number INTEGER, 
            description TEXT);""") 

my_data = [ [143, 800, 'Ask'], 
      [213, 457, 'Comment'], 
      [424, 800, 'Hi'] ] 

for row in my_data: 
    conn.execute("INSERT INTO Widget (id, serial_number, description) VALUES (?,?,?);" , row) 

conn.commit() # save changes 

res = conn.execute("SELECT * FROM Widget WHERE id=143") 
row = res.next() 
print row #prints (143, 800, u'Ask') 

請注意使用特殊文件名:memory:來打開臨時數據庫。

+0

+1感謝您的幫助 – 2012-03-11 16:48:26

0

我不理解,你想能夠更快地搜索文件本身,或者用python中的文件內容?在後者中,使用具有唯一元素作爲關鍵字的字典。

values = {143:[800,'ask'], 213:[457,'Comment'], 424:[800:'Hi']} 
+1

我標記了代碼,希望您不介意。 – MByD 2012-03-11 14:33:05

+0

@Niek de Klein我知道這個來自於存儲在字典中,但有時我沒有值的值[143] [1],即字符串'None'被存儲在它的位置。有沒有其他方法可以在python中完成相同的操作。也非常感謝您的回答。 – 2012-03-11 14:34:12

+0

是的,存儲'None'。 – aquavitae 2012-03-11 14:35:35

0

如果您需要在持久性存儲中查看事物,請使用數據庫。一個示例是sqlite,它是內置的。

+0

數據中心的問題在於,它會在每個程序執行過程中不斷輸入行...這是不可取的,因爲我希望在每個程序執行過程中看到我的新結果如何克服這一點。 'sqlite'1非常感謝您回覆 – 2012-03-11 14:53:11

+0

+1。作爲獎勵,如果你使用真正的數據庫,它會自動執行唯一鍵的唯一性(這對於捕獲編程錯誤和保持數據的一致性非常有用)。 – 2012-03-11 14:53:20

+0

@ user1172532:'sqlite3.open(': memory:')'會打開一個新的臨時'sqlite3'數據庫,它只存在於你的python解釋器會話/ python腳本的生命週期中。「數據庫」並不一定意味着「持久性」(即使如此,幾個「DROP TABLE」語句也會將其擦除乾淨。) – 2012-03-11 14:55:04

1

您要求的內容可能被稱爲「數據庫表」和「索引」。經典的方法是有一個補充文件(索引),它將表中數據元組的鍵映射到文件中元組的絕對位置。

+1

您是否知道Python的預滾動實現? ('sqlite3'會有資格。)試圖從頭開始這聽起來像是一個令人興奮的方式來產生錯誤。 – 2012-03-11 15:08:00

+0

不知道。這聽起來像是一個令人興奮的方式來寫一些新的東西:) – 2012-03-11 15:11:10

0
每個程序exection行會被插入

如果你想保持存儲在一個文件中,你做到這一點,那麼簡單的解決方案,以防止重複項

而且出現下一個執行將簡單地截斷該文件首先。你可以做到這一點,通過與w標誌打開它:

f = open('filename', 'w') 
# ... 
f.close() 

但是它的聲音,如果你只是想儲存一些數據執行程序,即要保持周圍的數據沒有使它執着。如果是這樣的話,那麼我想知道爲什麼你實際上將內容存儲在一個文件中。

更爲明顯的方式,也是pythonic(儘管它對Python不是特別的),應該是在程序執行過程中將它保存在字典中。字典是可變的,所以您可以隨時更改其內容:如果您稍後獲得更多信息,您可以添加新條目,甚至更新條目。

我知道這個在字典中存儲的,但有時我沒有值,值[143] [1],即字符串「無」被存儲在它的位置

這根本不是問題。您可以輕鬆存儲條目與143爲關鍵和None爲它的價值,甚至None值的數組:

>>> values[143] = [ None, None ] 

這樣一來,字典仍然會記得您輸入的關鍵,所以一個檢查,如果關鍵是在字典將返回true:

>>> 143 in values 
True 

難道還有比在Python字典對於accomplising同其他任何其他方式,我知道字典...我只是在尋找一些其他的方式。

沒有,通常只有一個做對Python中的東西的方式,也是由Zen of Python說:「應該有one--和最好只有一個--obvious辦法做到這一點。 「

因此,不,也許沒有適當的方式來使用沒有字典的字典。但是,再一次,你爲什麼要尋找其他方式?我聽不到這一點,就好像你有充分的理由這樣做,如果有的話,你必須確保你解釋爲什麼某些方法不適合你使用。

+0

因爲我希望與每個程序執行的行將插入...我不能使用它的字典。因爲這裏的字典將被保存在RAM中,並且考慮到我正在處理的數據......其中包含數以萬億計的條目......將數據保存在RAM中是不可行的,因此我正在尋找其他方法。非常感謝您的回答。 – 2012-03-11 20:45:48

相關問題