Я работаю над научным приложением на C для отправки инструкций, указывающих устройству выполнить эксперимент, затем считывания данных этого эксперимента и, в частности, для автоматизации этой функции, чтобы ее можно было в основном выполнять без моего ввода.
В настоящий момент я храню импульсные программы и файлы данных в виде файлов ASCII, но есть две проблемы, связанные с этим: во-первых, я обнаруживаю, что когда я загружаю файлы данных в матрицы Matlab и сохраняю их из Matlab и затем снова прочитайте их, чтение из файлов ASCII занимает в 100 раз больше времени, чем чтение из файлов .mat - это соответствует моему предыдущему опыту, что эти операции чтения / записи в ASCII являются самой медленной частью моей программы. Вторая проблема заключается в том, что всякий раз, когда я пытаюсь повысить универсальность программы, мне приходится создавать новую спецификацию формата для хранения файлов, что раздражает.
Я думаю о том, чтобы найти библиотеку SQL и сохранить все как реляционные базы данных, но из того, что я знаю о базах данных, вы не должны создавать большое количество небольших баз данных (файлы данных имеют размер от 50 до 50 Мб, программные файлы очень маленькие). Я действительно ищу что-то вроде функции Matlab save (), где я могу вывести переменную struct () в файл, а затем прочитать ее по имени. С базой данных это будет достаточно легко, но, похоже, должен быть более индивидуальный способ хранения файлов таким образом. Какие-либо предложения?
Редактировать
Извините за смутный язык здесь. Я пытался не увязнуть в деталях, чтобы вопрос мог иметь более широкое применение, но теперь я вижу глупость в этом. Вот именно то, что я делаю:
Начиная с импульсной программы, которая сохраняется в файле, вот шаги, которые я делаю:
1.) Чтение импульсной программы из файла ASCII, который выглядит следующим образом:
#ValidPulseProgram#
NInstructions= 15
NTransients= 1
DelayTime= 0.000000
TriggerTTL= 0
NPoints= 2000
SamplingRate= 2000.000000
PhaseCycle= 0
NumCycles= 4
CycleInstr= 2
CycleFreq= 60.000000
Dimensions= 2
[Point]
IndirectDim 1 - 1 of 51
[Instructions]
Instruction 0 0 4 0 0 10.000000 1000000000.000000
...
Instruction 2 0 266 0 0 750.000000 1000000.000000
Instruction 14 0 4 1 0 100.000000 1000000.000000
[EndInstructions]
nVaried= 1
VaryInstr 0 5 0 -1.000000 24 -1.000000 1200 -1.000000 1
Это считывается построчно и помещается в структуру, содержащую всю информацию.
2.) Отправьте структуру в программу, которая преобразует ее в нечто, читаемое устройством, которое устанавливает время и тому подобное, и начинает эксперимент.
3.) Данные поступают и хранятся в файлах ASCII, в которых есть заголовок, содержащий программу, которая использовалась, некоторую другую информацию о сборе. Каждое приобретение хранится в отдельном файле ASCII. Иногда существуют тысячи таких файлов, организованных в иерархию папок.
4.) Позже я хочу иметь возможность считывать из файлов ASCII. Я либо зачитываю их из этой программы на C, над которой я работаю, либо зачитываю их, используя скрипт Matlab, который считывает их в переменные matlab (для более интенсивного анализа данных). Последний шаг в этом скрипте - это вызов save (), который сохраняет файл .mat matlab. При приобретении, скажем, 50 файлов по 1000 точек в каждом, требуется около 10-30 секунд, чтобы вывести все данные в массив. Если я сохраню этот массив в файле .mat, а затем прочту его в рабочей области, это займет миллисекунды.
Итак, две проблемы - это шаг 4.) -> Я должен сохранить их немедленно, чтобы я мог прочитать их за миллисекунды, так как не требуется 30 секунд, чтобы прочитать несколько МБ из файла, и шаг 1.), где я хотел бы изменить этот ASCII-файл на что-то вроде двоичного файла, содержащего структуру.