2010-02-18 136 views
4

我有一個執行一個函數的C++程序。它將大數據文件加載到數組中,接收一個整數數組並在該數組中執行查找,返回一個整數。目前我正在打電話,每個整數程序作爲參數,就像這樣:在ruby腳本和正在運行的C++程序之間進行通信

$ ./myprogram 1 2 3 4 5 6 7 

我也有一個紅寶石腳本,我想這個腳本能利用C++程序。 目前,我正在這樣做。

的Ruby代碼:

arguments = "1 2 3 4 5 6 7" 
an_integer = %x{ ./myprogram #{arguemnts} } 
puts "The program returned #{an_integer}" #=> The program returned 2283 

這是所有工作正常,但我的問題是,每次紅寶石使得這個調用,C++程序必須重新加載數據文件(超過100MB) - 很速度慢,而且效率很低。

如何重寫我的C++程序只加載一次文件,這使我可以通過ruby腳本進行多次查找,而無需每次重新加載文件。使用套接字是一個明智的方法?把C++程序寫成ruby擴展?

顯然我不是一個有經驗的C++程序員,所以非常感謝您的幫助。

回答

6

一種可能的方法是修改您的C++程序,以便它從標準輸入流(std :: cin)而不是從命令行參數獲取輸入,並通過標準輸出(std :: cout)而不是主要的返回值。你的Ruby腳本會使用popen來啓動C++程序。

假設C++程序目前的樣子:

// *pseudo* code 
int main(int argc, char* argv[]) 
{ 
    large_data_file = expensive_operation(); 

    std::vector<int> input = as_ints(argc, argv); 
    int result = make_the_computation(large_data_file, input); 

    return result; 
} 

將它改造成類似:

// *pseudo* code 
int main(int argc, char* argv[]) 
{ 
    large_data_file = expensive_operation(); 

    std::string input_line; 
    // Read a line from standard input 
    while(std:::getline(std::cin, input_line)){ 
     std::vector<int> input = tokenize_as_ints(input_line); 
     int result = make_the_computation(large_data_file, input); 

     //Write result on standard output 
     std::cout << result << std::endl; 
    } 

    return 0; 
} 

而且Ruby腳本會是什麼樣子

io = IO.popen("./myprogram", "rw") 
while i_have_stuff_to_compute 
    arguments = get_arguments() 
    # Write arguments on the program's input stream 
    IO.puts(arguments) 
    # Read reply from the program's output stream 
    result = IO.readline().to_i(); 
end 

io.close() 
3

好,

你可以通過很多不同的方式來解決這個問題。

1)一個簡單的,潛在的醜陋的方式做到這一點是讓你的C++運行和間歇檢查文件,有你的Ruby腳本產生上述文件,其中包含你的論點。然後你的C++程序將使用包含的參數將其結果返回給你可以在你的ruby腳本中等待的結果文件......這顯然是HACK TASTIC,但它實現起來非常簡單,並且可以工作。

2)將C++代碼公開爲ruby的c擴展。這不像聽起來那麼難,特別是如果你使用RICE並且會提供更少的hackie解決方案。 3)如果你的C++可以通過c頭文件暴露出來,那麼使用FFI構造一個橋幾乎是微不足道的。傑里米Hinegardner給了一個很好的演講上,在RubyConf的構建FFI接口繼承人the screencast

4)D-Bus提供一種應用程序通信總線,你可以改變你的C++應用程序來獲取所述事件總線的優勢,並使用通過從紅寶石消息ruby-dbus

當然有一千其他路線...也許這些或其他這些可以證明可行:)

乾杯!

相關問題