Python和C#之间传递大表的建议

4
我有一个C#应用程序需要运行数千次。目前在开始运行时,它会预先计算一张大的常量值表供参考。由于这些值在每次运行中都是相同的,我想在一个简单的Python脚本中独立计算它们,然后只需让C#应用程序在每次运行开始时导入文件即可。
该表由一个排序的二维数组(500-3000+行/列)组成,每个元素是一个简单的(int x, double y)元组。我正在寻求有关最佳/最简单的存储和导入这些数据的建议。例如,我可以将数据存储在文本文件中,格式如下:"(x1,y1)|(x2,y2)|(x3,y3)|...|(xn,yn)"。这似乎是一个很丑陋的解决方案,而这个问题似乎适合使用特定的数据结构或库,但我目前不知道。如果您有任何建议,欢迎分享。
6个回答

2
我建议使用简化的csv文件。 考虑到您所有的值都是数字,您可以在C#中读取它们。
File.ReadAllText(filename).Split(',')

你可以在这里找到更多用于csv的C#选项。

在Python中,你可以使用csv模块来读写它们。更好的解释可以在这里找到,简而言之:

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

使用CSV还可以为将来的改进提供灵活性,以及与其他程序(如Excel)进行导入和导出以进行进一步处理。

2
您可以考虑运行IronPython - 这样您就可以在C#/ Python之间来回传递值。

我最初考虑过这个问题。然而,预先计算并将值存储在另一个文件中的主要好处是脚本不必在每次应用程序运行时都运行。使用IronPython,我需要在每次运行时调用脚本,这样移动计算到主程序外的目的就失去了意义。 - Mandelbrot

2
看一下NetCDF和/或HDF5文件格式。特别是HDF5似乎有一个.NET实现,而PyTables在Python方面非常方便。

1
为什么不让你的C#程序检查是否存在一个名为"constants.bin"的文件。如果该文件不存在,则生成数组并将其序列化到"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”文件不存在,因此它将生成 2D 数组,然后将其序列化到文件中。每次运行程序时,它都会找到“constants.bin”文件并将其反序列化为本地 2D 数组。


这是一个很好的解决方案。然而,针对这个特定问题,我已经决定采用 CSV 选项以获得更好的编辑灵活性。感谢您的建议! - Mandelbrot

1

CSV 是个不错的建议,但是当值为整数和浮点数时可能会有些笨拙。通常制表符或分号是最好的分隔符。


1

Python标准库包括sqlite3模块 - 一个轻量级的基于磁盘的数据库。 对于C#,有一些提供sqlite支持的库。 例如,System.Data.SQLite - 一个完整的ADO.NET 2.0/3.5提供程序。

对于您的应用程序,请使用数据类型REAL(存储为8字节IEEE浮点数) 和INTEGER(根据值的大小在1、2、3、4、6或8个字节中存储)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接