2010-07-28 25 views
3

我有一個C#應用程序需要運行幾千次。目前它在運行開始時預先計算一個大的恆定值表以供參考。由於這些值從運行到運行都是相同的,我想用一個簡單的python腳本獨立計算它們,然後讓C#應用程序在每次運行開始時導入文件。在Python和C之間傳遞大表的建議#

該表由簡單(int x,double y)元組的排序二維數組(500-3000 +行/列)組成。我正在尋找關於存儲和導入這些數據的最佳/最簡單的方法的建議。例如,我可以將數據存儲在文本文件中,如「(x1,y1)|(x2,y2)|(x3,y3)| ... |(xn,yn)」這似乎是一個非常難看的解決方案這個問題似乎適用於我目前不知道的特定數據結構或庫。歡迎大家提出意見。

回答

2

我會去一個簡化的csv文件。 鑑於所有你的價值觀是數字,你可以在C#中使用

File.ReadAllText(filename).Split(',') 

你可以找到CSV here

更多C#選項在Python中,你可以使用csv模塊讀取和寫入他們閱讀。更好的解釋here,但它的短是

import csv 
writer = csv.writer(filename) 
writer.writerows(data) 

使用CSV還爲您提供了未來改進的靈活性,以及​​出口和Excel等其他程序作進一步處理進口。

2

您可以考慮運行IronPython的 - 那麼你可以傳遞值來回C#/ Python的

+0

我最初考慮過這個問題。但是,預先計算並將值存儲在另一個文件中的主要好處是腳本不必每次運行應用程序時都運行。對於IronPython,我不得不每次運行腳本都要調用這個腳本,這樣做會破壞在主程序之外移動計算的目的。 – Mandelbrot 2010-07-28 18:11:24

1

爲什麼不只是有一個名爲類似「constants.bin」文件的存在,你的C#程序檢查。如果該文件不存在,則讓它生成數組並將其序列化爲「constants.bin」。如果該文件確實存在,那麼就使用串行讀回。

int[,] constants; 

if(!File.Exists("constants.bin")) { 
    GenerateConstants(); 

    Stream stream = new FileStream("constants.bin", FileMode.Create, FileAccess.Write, FileShare.None); 
    new BinaryFormatter.Serialize(stream, constants); 
    stream.Close(); 
} 
else 
{ 
    Stream stream = new FileStream("constants.bin", FileMode.Open, FileAccess.Read, FileShare.Read); 
    constants = (int[,])(new BinaryFormatter.Deserialize(stream)); 
    stream.Close(); 
} 

我沒有測試過這一點,所以你可能需要調整它一點點。

第一次運行C#應用程序時,「constants.bin」將不存在,因此它將生成二維數組,然後將其序列化到文件中。程序的每次後續運行都會找到「constants.bin」文件並將其反序列化爲本地二維數組。

+0

這是一個很好的解決問題的方法。但是,我已決定針對此特定問題使用csv選項來編輯靈活性。感謝您的建議! – Mandelbrot 2010-07-28 18:38:46

1

CSV是很好的建議,但可能笨拙的值是int和double。通常製表符或半分法是最好的分隔符。

1

Python標準庫包括sqlite3 module - 一個輕量級的基於磁盤的數據庫。 對於C#,有幾個庫提供sqlite支持。 例如,System.Data.SQLite - 完整的ADO.NET 2.0/3.5提供程序。

對於你的應用程序,使用的數據類型REAL(存儲爲一個8字節IEEE浮點數) 和INTEGER(取決於值的大小存儲在1,2,3,4,6,或8字節) 。

2

看一看NetCDF和/或HDF5文件格式。特別是HDF5似乎有一個。NET的實現,而PyTables在Python的一面很方便。