2013-03-06 82 views
3

我正處於構建仿真的規劃階段,需要關於如何根據內存和速度考慮來表示數據的想法。對於仿真系統,哪種數據結構最合適?

在每個時間步驟,模擬過程創建10^3到10^4個新數據記錄,並查看每個新的或現有記錄(其中有10^6到10^8個),然後刪除它或修改它。

每條記錄​​都有3-10個簡單字段,每個字段可以是一個整數,也可以是幾個ASCII字符的字符串。另外,每個記錄還有1-5個其他字段,每個字段都是一個包含整數的可變長度列表。典型的記錄重量爲100-500字節。

修改或刪除過程如下工作:對於此記錄,計算一個函數,其參數是某些此記錄的字段的值,以及另一個記錄的這些字段的值。根據結果​​,該過程準備以某種方式刪除或修改其字段。

然後重複每個其他記錄。然後移動到下一個記錄並重復。當所有記錄都被處理完畢後,仿真就可以轉移到下一個時間步驟。

在轉到下一個時間步驟之前,應用準備的所有刪除和修改。

允許的記錄越多,仿真效果越好。如果所有記錄都在RAM中,則下行是仿真大小,並且可能上行速度。模擬不需要是實時的,但顯然我不希望它太慢。

爲了表示內存中的每條記錄,我知道這些選項:列表或字典(其中嵌套一些列表)或類實例。爲了將所有記錄儲存起來並在另一天繼續進行模擬,我逐漸熟悉的選項是:一個csv文件,其中每行都是記錄,或者只是將所有記錄放入RAM中,然後將它們放入一個文件中(可能使用醃菜),或者使用某種數據庫。

我學過Python基礎知識,加上一些像發電機的概念,但沒有學過數據庫,沒有嘗試過酸洗,顯然需要了解更多。如果可能的話,我會避免使用多臺計算機,因爲我只有1個併發數,因爲它看起來太可怕了。

對於如何在內存中表示記錄以及如何存儲模擬系統,您有何建議?

+0

先從最簡單的方法開始,但是留下[只要]抽象以根據需要進行更改。無論如何,「關鍵值存儲」或「持久哈希」存儲可能值得研究。 – 2013-03-06 00:43:30

回答

1

如果我們採取最壞的情況,每個記錄10 ** 8個記錄和500個字節,這將是大量的RAM,所以這是值得設計一些靈活性,並且假設並非所有記錄都將永久駐留在RAM中。你可以創建一個抽象類來隱藏記錄所在的細節。

class Record(object): 
    def __init__(self, x, y, z): 
     pass # code goes here 
    def get_record(id): 
     pass # code goes here 

而不是使用名稱get_record()你可以使用名稱__index__(),然後你的類會像一個名單,但可能會走出去到一個數據庫,或引用RAM緩存,或什麼的。只需使用整數作爲ID值。然後,如果您改變了對持久性存儲的注意(從數據庫切換到pickle或其他),實際的代碼不會改變。

您也可以嘗試製作一個真正巨大的交換文件,並讓虛擬內存系統處理記錄進出實際RAM。這很容易嘗試。它沒有任何簡單的方法來中斷計算並保存狀態。

您可以將每條記錄表示爲元組,即使是指定的元組。我相信一個元組在Python中的所有「容器」對象的開銷最低。 (一個命名的元組只在一個地方存儲了一次名稱,所以它的開銷也很低。)

相關問題