Предложения по передаче большой таблицы между Python и C # - PullRequest
4 голосов
/ 28 июля 2010

У меня есть приложение на C #, которое нужно запускать несколько тысяч раз. В настоящее время он предварительно вычисляет большую таблицу постоянных значений в начале цикла для справки. Поскольку эти значения будут одинаковыми при запуске, я бы хотел вычислить их независимо в простом скрипте Python, а затем просто заставить приложение C # импортировать файл в начале каждого запуска.

Таблица состоит из отсортированного двумерного массива (500-3000 + строки / столбцы) простых (int x, double y) кортежей. Я ищу рекомендации относительно лучшего / самого простого способа сохранить и затем импортировать эти данные. Например, я мог бы хранить данные в текстовом файле, например, так: «(x1, y1) | (x2, y2) | (x3, y3) | ... | (xn, yn)» к проблеме, которая, кажется, поддается определенной структуре данных или библиотеке, о которой я сейчас не знаю. Любые предложения приветствуются.

Ответы [ 6 ]

2 голосов
/ 28 июля 2010

Ознакомьтесь с форматами NetCDF и / или HDF5 . HDF5, в частности, кажется, имеет реализацию .NET, а PyTables удобен для Python.

2 голосов
/ 28 июля 2010

Вы можете рассмотреть возможность запуска IronPython - тогда вы можете передавать значения вперед и назад по C # / Python

2 голосов
/ 28 июля 2010

Я бы пошел за упрощенный CSV-файл.Учитывая, что все ваши значения являются числами, вы можете прочитать их в C #, используя

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

. Вы можете найти больше вариантов C # для csv здесь

. На Python вы можете использоватьмодуль csv для чтения и записи.Лучшее объяснение здесь , но самое короткое из них

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

Использование CSV также дает гибкость для будущих улучшений, а также для экспорта и импорта из других программ, таких как Excel, для дальнейшей обработки.

1 голос
/ 28 июля 2010

Python стандартная библиотека включает в себя модуль sqlite3 - легковесная дисковая база данных. Для C# есть несколько библиотек, обеспечивающих поддержку sqlite. Например, System.Data.SQLite - полный поставщик ADO.NET 2.0 / 3.5.

Для вашего приложения используйте типы данных REAL (хранятся в виде 8-байтового числа с плавающей запятой IEEE) и INTEGER (сохраняется в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения).

1 голос
/ 28 июля 2010

CSV - хорошее предложение, но может быть неуклюжим со значениями int и double.Обычно табуляция или полукомма являются лучшими разделителями.

1 голос
/ 28 июля 2010

Почему бы просто не заставить вашу программу на 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-массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...