2009-12-20 10 views
2

У меня есть задача, которую я знаю, как кодировать (в C#), , но я знаю, что простая реализация не удовлетворит ВСЕ мои потребности. Итак, я ищу трюки, которые могут удовлетворить ВСЕ мои потребности.Методология для сохранения значений с течением времени

  1. Я пишу симуляцию с участием N числа сущностей, взаимодействующих во времени.

  2. N начнется примерно в 30 и переместится на многие тысячи.

    a. The number of entities will change during the course of the simulation. 
    

    b. Я ожидаю, что это потребует, чтобы каждый объект имел свой собственный файл трассировки.

  3. Каждый объект имеет как минимум 20 параметров, до миллионов; Я хочу отслеживать с течением времени.

    a. Это, скорее всего, потребует, чтобы мы не могли постоянно сохранять все значения в памяти. Некоторые подмножества должны быть точными.

    b. Первоначально число параметров на объект будет фиксированным, но я могу придумать какой-то тест, который бы менял со временем замедление числа параметров.

  4. Моделирование продлится миллионы шагов времени, и мне нужно сохранить каждое значение для каждого параметра.

  5. Что я буду использовать эти следы для:

    а. Построение поднабора (настраиваемого) параметров в течение фиксированного промежутка времени с текущего временного шага в прошлое.

    i. Normally on the order of 300 time steps. 
    
    ii. These plots are in real time while the simulation is running. 
    

    b. Я буду использовать эти трассировки для повторного воспроизведения имитации, поэтому мне нужно быстро получить доступ ко всем параметрам на этапе предоставления времени, чтобы я мог быстро перейти к разным временам в симуляции.

    i. This requires the values be stored in a file(s) which can be inspected/loaded after restarting the software. 
    
    ii. Using a database is NOT an option. 
    

    c. Я буду использовать параметры для последующего анализа, которые я не могу определить спереди, поэтому желательна более гибкая система.

Моя первая мысль:

  1. Один класс по каждому субъекту, который содержит все параметры.

  2. Опираясь на файл с памятью.

  3. только фиксированный, но перемещение, количество файла отображается в основной памяти

  4. Вторая память отображается файл, который имеет временные индексы в основной файл для быстрого доступа во время повторного воспроизведения моделирования. Это может быть очень важно, потому что каждый файл сущности будет представлять собой другой временной срез полного моделирования.

+2

Почему использование базы данных не вариант? Я просто ничего не вижу в ваших требованиях, которые сделают реляционную базу данных нецелесообразной. –

+0

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

+0

База данных не подразумевает сетевой сервер. Проверьте ответ на SQLite или SQL CE. – codekaizen

ответ

2

KISS - просто напишите файл журнала для каждого объекта, и каждый раз срез выписывает каждый параметр в указанном порядке (поэтому вы не удваиваете размер файла журнала, добавляя имена параметров). Вы можете иметь заголовок в каждом файле журнала, если вы хотите указать имена параметров для каждого столбца и идентификатор объекта.

Если есть много значений параметров, которые будут оставаться фиксированными или медленно меняться в ходе моделирования, вы можете записать их в другой файл, который кодирует только изменения значений параметров, а не каждое значение в каждом временном фрагменте.

Возможно, вам необходимо синхронизировать журнал, чтобы каждая запись в журнале записывалась с одинаковым значением времени. Вместо того, чтобы координировать через центральный файл, просто сделайте первое значение в каждой строке файла значением времени.

Забудьте о базе данных - слишком медленно и слишком много накладных расходов для целей повторного моделирования. Для воспроизведения симуляции вам просто потребуется последовательный доступ к каждому временному фрагменту, который наиболее эффективно и быстро реализуется простым чтением в строках файлов один за другим.

По той же причине - скорость и эффективность пространства - забудьте XML.

+0

Это были мои общие мысли, но я просто не уверен из-за широкого диапазона требований. Да, регистрация будет синхронизирована независимо от метода, который я использую. Вторичный, почти каждое значение будет меняться в течение каждого шага. –

+1

Если вы пойдете так, я думаю, вам лучше с двоичным файлом и фиксированной шириной, а не с текстами. Это позволит искать тривиальную задачу (и будет намного более рациональной по площади). Кажется, из вашего описания, что записи с фиксированной шириной не являются проблемой. –

+0

Я ожидаю выписать необработанные двоичные копии значений плавающего/целого числа. –

1

Просто для части памяти ...

1.You может сохранять данные как xElemet (жаль, не зная много о LINQ), но она содержит логику XML.

2.hold record record.

после п записей сохранить XElement к XMLFILE (data1.xml, ... dataN.xml)

Это может быть идеальный журнал для любого параметра у вас с какой-либо логики, вы хотите:

<run> 
    <step id="1"> 
    <param1 /> 
    <param2 /> 
    <param3 /> 
    </step> 
    . 
    . 
    . 
    <step id="N"> 
    <param1 /> 
    <param2 /> 
    <param3 /> 
    </step> 
</run> 

Таким образом, ваша память свободна, и данные относительно бесплатны. Вам не нужно слишком много думать о проблемах с БД, и это довольно удивительно, что LINQ может сделать для вас ... просто откройте правильный файл журнала XML ...

+0

Я подумал о чем-то подобном, но я не вижу, как это работает с требованиями к воспроизведению плюс размер элементов XML, что может привести к удвоению размера этих файлов. Поскольку, я ожидаю, что эти файлы будут составлять несколько гигабайт каждый, это кажется слишком расточительным. С учетом полного набора требований это сложная часть, и именно поэтому я задаю этот вопрос. Я открыт для любых мыслей и обсуждений, чтобы помочь в этом. Благодарю. –

+0

Миллионы шагов ... Вам понадобится возраст, чтобы прочитать этот XML. –

3

Я бы начал с SQLite. SQLite похож на библиотеку бинарного формата, которую вы можете запросить удобно и быстро. Это не действительно как база данных, в которой вы действительно можете запускать ее на любой машине без какой-либо установки.

Я настоятельно рекомендую против XML, учитывая требование миллионов шагов, потенциально с миллионами параметров.

EDIT: Учитывая огромное количество данных, SQLite вполне может оказаться слишком медленным для вас. Не поймите меня неправильно, SQLite очень быстро, но он не будет бить ищет & читает, и похоже, что ваш прецедент таков, что базовый двоичный IO довольно уместен.

Если вы идете с использованием двоичного метода ввода-вывода, вам следует ожидать некоторого умеренно вовлеченного кодирования и отсутствия таких тонкостей, как ваш файл, находящийся в согласованном состоянии, если приложение умирает на полпути (если вы не указали именно это).

+1

Я бы пошел с SQL CE вместо того же использования, но более функциональным и доступным с C#. – codekaizen

+0

Справедливая точка. SQLCE может быть лучше с точки зрения инструментальной цепочки. Это немного сложнее перераспределить, хотя я считаю, что стандартный способ заключается в перераспределении (бесплатной) MSI. –

+0

Интересно, хотя. Я только что сделал расчет конверта, и каждый объект будет иметь журналы значений на общую сумму около 1,5 ГБ и всего лишь 4 объекта, которые превысят пределы 4 ГБ в SQLCE. Я просто быстро просмотрел ограничения SQLLite, и я не смог его найти. Я сделаю больше поиска. Это была идея, о которой я не думал, и именно такая информация мне нужна. –

0

вот что я делаю сейчас

int bw = 0; 
private void timer1_Tick(object sender, EventArgs e) 
     { 
      bw = Convert.ToInt32(lblBytesReceived.Text) - bw; 
      SqlCommand comnd = new SqlCommand("insert into tablee (bandwidthh,timee) values (" + bw.ToString() + ",@timee)", conn); 
      conn.Open(); 
      comnd.Parameters.Add("@timee",System.Data.SqlDbType.Time).Value = DateTime.Now.TimeOfDay; 
      comnd.ExecuteNonQuery(); 
      conn.Close(); 
     } 
+0

Вы можете уточнить, где это применимо? какая часть в исходном вопросе? – emecas

Смежные вопросы