C: База данных слишком мощная для небольших файлов? - PullRequest
1 голос
/ 12 июля 2011

Я работаю над научным приложением на 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-файл на что-то вроде двоичного файла, содержащего структуру.

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

MATLAB имеет библиотеку C / C ++ и Fortran API , которая включает в себя библиотеку MAT-File .Это было бы наиболее очевидным решением.

При чтении файла ASCII, MATLAB возможно, возможно, что он добавляет каждое значение к матричной переменной без априорного знания о конечном размере, поэтомуон будет постоянно выделять, перераспределять и перемещать данные в памяти по мере увеличения размера матрицы - для больших наборов данных это часто будет связано с заменой диска виртуальной памяти и может быть очень медленным.В любом случае, он медленный и недетерминированный.Когда файл .MAT читается, он выделяет правильный размер один раз и загружает данные за один раз.

3 голосов
/ 12 июля 2011

HDF5 - это формат библиотеки / файла, разработанный как база данных для научных данных. Это немного сложнее, чем просто выгрузка в ASCII, но он был оптимизирован для скорости и имеет привязки для довольно многих языков (C, Fortran, Python, также кажется, что Matlab также имеет встроенные возможности).

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

0 голосов
/ 12 июля 2011

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

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

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

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