Я хотел бы разобрать
CLASSA classAvalue;
CLASSB classBvalue;
... ....
CLASSX classXvalue;
текст из файла ..
их порядок непредсказуем
то есть;
CLASSX classXvalue;
CLASSY classYvalue;
.... ......
CLASSA classAvalue;
CLASSB classBvalue;
У меня есть классы / структура имени A, B, C …. X и мне нужно подтолкнуть значения к их соответствующим значениям, Я хочу, чтобы все было просто, регулярные выражения не используются для разбора этого текста.
RUNTIME имеет решающее значение для меня .. У меня есть файл, который содержит> 300 МБ данных для анализа,
Я пришел с идеей токенизации строки strtok () .. но прежде чем нажать tvalue, я должен сравнить, какой тип данных я нажимаю … это занимает некоторое время …
В некотором смысле я хочу оптимизировать способ передачи данных в соответствующие классы … даже миллисекунды имеют значение, в конце я мог бы сэкономить пару драгоценных секунд времени выполнения.
Пожалуйста, поделитесь своими мыслями по этому поводу, я буду благодарен ..
Ваше описание проблемы требует более подробной информации. Если токены можно выразить как регулярные выражения (я не говорю, что на самом деле используйте RE, а просто спрашиваю, возможно ли это), тогда самый быстрый способ их сканирования — это ручное кодирование дискретного конечного автомата. Если вы дадите РП, я покажу вам, как это сделать.
Как уже было сказано, использование файловой системы наилучшим образом так же важно, как и хороший алгоритм сканирования. Вы не дали свою ОС, поэтому мы не можем помочь вам с этим. Во многих ОС отображение памяти (например, в Linux, mmap
) самый быстрый.
Что входит в «подталкивание [значения] к их соответствующим значениям»? Возможно, вы имели в виду соответствующий класс или некоторую переменную / функцию аккумулятора? Если бы вы могли привести пример обработки как минимум двух разных классов данных, это могло бы иметь большое значение для получения «наилучшего» ответа.
Сейчас я предполагаю, что данные представлены именно так, как показано в вашем вопросе. В зависимости от того, как вы указываете свои классы в текстовом файле, существуют более эффективные способы переключения () на значение, например использование целого числа, чтобы избежать использования функции strcmp (), приведенной ниже.
// псевдокод
while(not EOF)
read a line from the file with fscanf or similar
split sequence on first occurrence of a space
switch() on the first segment which should be CLASS_
call appropriate function to handle your data
// пример данных:
myclassA 12345
myclassB 67890
myclassC 19348
int data
char class_str[MAX_CHARS];
ret = fscanf(fp,"%s %i",class_str,&data);
while(ret != EOF){
switch(class_str){
case(strcmp(class_Str,"myclassA")==0):
myclassA_data_processing_function();
break;
case(strcmp(class_Str,"myclassB")==0):
myclassB_data_processing_function();
break;
}
}
Если имеет значение одна миллисекунда — тогда попробуйте реализовать Структура данных Trie иметь самое быстрое совпадение типов. Предполагая, что вы уже прочитали тип char type[]
и ты знаешь type
длина:
switch (typeLength) {
case 3: // for cases where only one type aplies like e.g. Abc
if (0 == memcmp(type, "Abc", 3) { /* read Abc object from stream */ }
else ERROR;
break;
case 5: // e.g. "Abcde", "Abcdf", "Ebcde"switch (type[0]) {
case 'A':
// "A,,,"switch (type[1]) {
case 'b':
...
switch (type[4]) {
case 'e': // read Abcde object
case 'f': // read Abcdf object
... default: ERROR
case 'E': // only Ebcde matches
if (0 == memcmp(type + 1, "bcde") { /* read Ebcde object from stream */ }
else ERROR;
.....
Это не очень легко реализовать, но я считаю, что это самый быстрый способ определить тип объекта из строки, если только вы знаете типы перед анализом.
В таких простых случаях, как ваш, производительность ввода-вывода часто важнее производительности процессора. Так что вы должны убедиться, что вы, например, правильно настроили буферизацию.