"Указанный тип должен быть структурой, не содержащей ссылок" с использованием TeaFiles.NET
Я нашел эту убедительную библиотеку под названием TeaFiles.NET.
Я пишу очень простое консольное приложение, чтобы проверить его.
Вот код:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting....");
string filename = String.Format("History_{0}.{1}.{2}.tea",
DateTime.Now.Year,
DateTime.Now.Month,
DateTime.Now.Day);
File.Delete(filename);
using (var tf = TeaFile<HistoryRow>.Create(filename))
{
var items = new List<HistoryRow>();
for (int i = 0; i < 1000; i++)
{
for (int k = 0; k < 100000; k++)
{
items.Add(new HistoryRow()
{
Flags = 192,
Name = "Name_" + i.ToString(CultureInfo.InvariantCulture),
Value = k,
Timestamp = DateTime.Now.AddTicks((long)i)
});
}
}
var sw = Stopwatch.StartNew();
Console.WriteLine("Initiate write...");
tf.Write(items);
sw.Stop();
Console.WriteLine("...completed write in {0} ms.", sw.ElapsedMilliseconds);
}
Console.ReadLine();
}
}
struct HistoryRow
{
public string Name;
public dynamic Value;
public Time Timestamp;
public int Flags;
}
Это должно быть довольно просто. Вместо этого он вызывает ошибку при вызове Create() со следующей ошибкой:
"The specified Type must be a struct containing no references".
Я действительно не знаю, с чего начать устранение неполадок....
1 ответ
Решение
TeaFiles обеспечивают быстрый доступ для чтения / записи данных временных рядов. Учитывая, что библиотека требует struct
содержащий то, что @dtb описывает как blittable типы, это должно работать:
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct HistoryRow
{
public char[16] Name;
public double Value;
public Time Timestamp;
public int Flags;
}
Обратите внимание, что при хранении временных рядов вы, как правило, не сохраняете описание со значением, которое является одним из многих значений в столбце, который уже имеет имя.