2014-09-23 106 views
-1

我有以下形式的數據龐大的字符串:無法存儲在內存中的

#@ De 
A B C. 
#@ dabc 
xyz def ghi. 
#@ <MyName_1> 
Here is example. 
#@ Df 
A B C. 
#@ <MyName_2> 
De another one. 
#@ <MyName_3> 
Df next one. 
#@ dabc1 
xyz def ghi. 
#@ <MyName_4> 
dabc this one. 

轉換成以下形式:

A B#1 C. //step 1 -- 1 assigned to the first occurrence of A B C. 
xyz def#1 ghi. //1 assigned to first occurrence of xyz def ghi 
Here is example 
A B#2 C. //step 1 -- 2 assigned in increasing order 
B#1 another one. //step 2 
B#2 next one. 
xyz def ghi. 
def#1 this one. 

//這裏代表的意見,並且不爲輸出的一部分。

該算法如下。

  1. 如果重複##後面的第二行。然後,附加到中間詞#number的 ,其中number是一個數字標識符,並且是以第二行的重複次序遞增的順序分配的 。
  2. 將#@ ...替換爲出現的單詞#編號。
  3. 刪除所有#@,其中第二行不重複。

爲了達到這個目的,我存儲了所有的三元組,然後查找它們的出現次序,以便按遞增順序分配數字。有沒有其他的方式來實現python中的相同。實際上,我的文件是500GB,並且不可能將所有三元組存儲在內存中以查找它們的出現。

+2

第二行如何從'A B C.'轉換爲'A B#1 C.'? (我猜'''評論不是輸出的一部分?)我不明白應該做到這一點的三條規則中的任何一條。 – abarnert 2014-09-23 21:46:45

+0

@JoranBeasley好的。你能說明如何使用數據庫做同樣的事情嗎?因爲我是在python中使用數據庫的新手 – user3809749 2014-09-23 21:46:44

+0

@abamert是的,你是正確的//是評論。我正在使用它們來說明這一點。 – user3809749 2014-09-23 21:47:25

回答

1

如果您需要的東西類似於字典,但太大而無法保存在內存中,您需要的是鍵值數據庫。

最簡單的方法是使用dbm類型的庫,它是一個非常簡單的鍵值數據庫,其接口與dict幾乎完全相同,只是它只允許鍵和值的字符串,並且具有一些額外的方法來控制持久性和緩存等。根據您的平臺,以及如何你的Python 2.7的建成,你可能有任何的:

最後三個都可以使用PyPI上,如果你的Python安裝不包括它們,只要你有libbsddb本身相關的版本,並沒有其許可證的任何問題。

問題是,根據您的平臺,各種底層數據庫庫可能不存在(當然,您可以下載C庫,安裝它,然後構建並安裝Python包裝器),或者可能不支持數據庫這很大,或者可能這樣做,但只能以非常低效的方式(或者在少數情況下,以一種錯誤的方式......)來實現。

希望他們中的一個能爲你工作,但你真正知道的唯一方法就是測試你所有的。

當然,如果我理解正確,你將字符串映射到整數,而不是字符串。您可以使用shelve模塊,該模塊包裝了所有類似dbm的庫,以允許您使用字符串鍵,但是可以選擇任何值作爲值......但這對於這樣的情況是巨大的矯枉過正(並且可能會損害您的性能);你只需要改變這樣的代碼:

counts.setdefault(key, 0) 
counts[key] += 1 

...到這一點:

counts.setdefault(key, '0') 
counts[key] = str(int(counts[key]) + 1) 

當然,你可以隨便寫一個包裝類,這是否對你(甚至一個支持Counter接口而不是dict接口)。


如果這不起作用,您需要一個更強大的數據庫。

Python的大多數版本都在stdlib中有sqlite3,但使用它需要學習相當低級的API,並學習SQL,這是一種與Python完全不同的完全不同的語言。 (這裏也有各種不同的關係數據庫,但你不應該需要它們中的任何一個)。

還有各種各樣的查詢表達式庫甚至全對象關係映射器,如SQLAlchemy(它可以以任何一種方式使用),它們可以讓你以更加Python的方式編寫你的查詢,但它仍然不會像使用dictdbm那樣簡單。 (話雖這麼說,它並不難環繞SQLAlchemy一個dbm般的界面。)

也有各種各樣的非關係型或半關係型數據庫中的一些術語NoSQL,最簡單的下一般集中其中基本上是類固醇上的dbm。同樣,他們通常需要學習一個相當低級的API,有時候也需要一種查詢語言 - 但其中一些會有很好的Python庫,使它們更易於使用。

+0

[你將需要一個更大的船](https://www.youtube.com/watch?v=8gciFoEbOA8) – dawg 2014-09-23 22:14:16