2010-09-02 45 views
1

存儲數據的簡單方式我有一個Python腳本,做了沿着線:從多個進程

def MyScript(input_filename1, input_filename2): 
    return val; 

即每對輸入的,我計算某些浮點值。請注意val是一個簡單的double/float。由於這種計算非常密集,我將跨越不同的進程(可能在同一臺計算機上,可能在多臺計算機上)運行它們。

我之前做的是我輸出這個值到一個文本文件:input1_input2.txt。然後,我將有1000000個文件,我需要將其縮減爲一個文件。這個過程不是很快,因爲操作系統不喜歡文件太多的文件夾。

如何將所有這些數據有效地存入一臺計算機?也許讓MongoDB在計算機上運行並且所有進程都會一起發送數據?

我想要簡單的東西。我知道我可以在MPI中做到這一點,但我認爲對於這樣一個簡單的任務來說是過度的。

回答

1

如果輸入對他們有自然順序,並且每個工作人員都可以找出它正在處理的「哪個」輸入,則每臺計算機可以獲得一個文件。由於Python浮動長度爲8個字節,因此每個工作人員會將結果寫入文件中自己的8字節插槽。

import struct 

RESULT_FORMAT = 'd' # Double-precision float. 
RESULT_SIZE = struct.calcsize(RESULT_FORMAT) 
RESULT_FILE = '/tmp/results' 

def worker(position, input_filename1, input_filename2): 
    val = MyScript(input_filename1, input_filename2) 
    with open(RESULT_FILE, 'rb+') as f: 
     f.seek(RESULT_SIZE * position) 
     f.write(struct.pack(RESULT_FORMAT, val)) 

比起寫了一堆的小文件,這種做法也應該是少了很多I/O密集型的,因爲很多工人將被寫入到操作系統緩存相同的頁面。

(請注意,在Windows上,您可能需要一些額外的設置以允許在進程之間共享文件。)

0

您可以運行一個收集輸出的程序,例如通過XMLRPC。

1

您可以生成包含生成包含生成的子文件夾的子文件夾結構。

例如,您有一個包含256個子文件夾的主文件夾,每個子文件夾包含256個子文件夾。 3級深度就足夠了。您可以使用guI的子字符串來生成唯一的文件夾名稱。

所以引導AB67E4534678E4E53436E成爲包含子文件夾67的文件夾AB,該文件夾包含文件夾E4534678E4E53436E。

使用2個字符的2個子字符串可以生成256 * 256個文件夾。足以存儲100萬個文件。