Здравствуйте, Evgeny.Panasyuk, Вы писали: EP>непонятно зачем кому-то использовать голое API при наличии готовых библиотек, предоставляющих все необходимые возможности.
зачем с++ ???
код похож на каку, платят за весь тот объём знаний, ухищрений, наработок и костылей мало,
есть же нормальные ФЯ, в которых не нужно задумываться о каком-то токенайзере,
в которых можно строить всевозможные типы данных, хитросплетения функций,
в которых всё легко запараллеливается, кода мало и он красивый
Здравствуйте, anatoly1, Вы писали:
Ф>>как я могу повторить ваш эксперимент?
A>Распарсить большой файл, каждая строчка которого имеет формат вида: A>a1;a2;a3;a4;...;a200 A>Необходимо каждую такую строку преобразовать в объект наподобие: A>obj = ["a1", "a2", ..., "a200"]
Остаются маленькие вопросы в размере файла, кодировке и в необходимости возвращать коллекции для каждой сторки (итератора / элементов по одному недостаточно?).
Патамучта в случае определенных ответов можно читать байты и отсекать по разделителю и/или newline.
Здравствуйте, Aртём, Вы писали:
Aё>Только Java и C (без плюсанутых) спасут этот мир .
Тут, на форуме, скромно пытаюсь высказать такую же мысль.
Страуструп дополнил чистый C OOП-ом. ООП это важно в ЯП. На этом можно было бы
и остановиться. Но C++ превратился в пастбище праздных академиков, которые
курят то, что даже мыщъху не известно. Они превратили язык в демонстрацию
своей нужности и важности. Лучше бы тесселяционные шейдеры в Mesa разрабатывали,
и вообще занимались чем полезным.
Здравствуйте, smeeld, Вы писали:
S>Здравствуйте, alex_public, Вы писали:
_>>И соответственно этот код работает у меня где-то в 2,5 раза быстрее, чем его аналог на Питоне.
S>Осталось немного, и придёт, наконец, понимание, что здесь, в этой задачке, контейнеры и стримы вообще S>ни куда не упёрлись. Их нельзя использовать на каждый чих. Сформировать malloc-ом буфер с содержимым S>файла, разбить его на токены или предложения нуль терминатором, последовательно с занесением указателей в массив. S>Вот указатели, а лучше их unique_ptr, можно уже складывать в вектор. Только не забыть задать ему первоначальный S>размер отличный от нуля, а то vector, созданный дефолтным конструктором, сначала запрашивает память под объект, S> потом под два, копируя туда содержание предыдущего буфера и удаляя его, потом под четыре и так далее, кто-то S>скажет, что использовать такой способ организации буфера правильно?
Нет. Шаблоны фундаментальный и необходимый инструмент. Если Вас не затруднит прочитать
внимательней, то поймёте, что речь идёт о неаккуратном, бездумном
использовании контейнеров.
Здравствуйте, smeeld, Вы писали:
S>Здравствуйте, Няшка, Вы писали:
Н>>Веткой случаем не промахнулись?
S>Нет. Шаблоны фундаментальный и необходимый инструмент. Если Вас не затруднит прочитать S>внимательней, то поймёте, что речь идёт о неаккуратном, бездумном S>использовании контейнеров.
1. Vector — это шаблон
2. Рост которого не всегда сопровождается копированием данных — зависит от реализации и аллокатора
3. Если Вы работаете не только с однобайтовым английским языком, то создать хороший текстовый парсер не на шаблонах будет тугой задачей
4. Читать весь файл csv в память и разбивать терминатором, чтобы потом копировать memcpy/strcpy — это бредовая идея для домашнего программирования. Подумайте внимательно, как будет работать Ваше решение на большом файле?.. а на сервере в несколько потоков?..
Какая будет стратегия на ошибки выделения памяти??? Как будете отдавать процессорное время другим задачам??? Куча не нужных проблем появится.
80% людей оценивают свое мастерство выше среднего...
Здравствуйте, anatoly1, Вы писали:
A>Распарсить большой файл, каждая строчка которого имеет формат вида: A>a1;a2;a3;a4;...;a200 A>Необходимо каждую такую строку преобразовать в объект наподобие: A>obj = ["a1", "a2", ..., "a200"]
И что дальше? Обработать каждую строчку и забыть? Или поиметь весь файл в памяти в виде развесистой структуры?
Иными словами, что должно остаться в памяти после окончания парсинга файла?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, smeeld, Вы писали:
S>>Покапитанить решили? Не интересно так.
PD>Интересно или нет, но эту функцию никто здесь не упомянул. Получилось впечатление, что либо нужно писать что-то совсем уж вручную (как у тебя), или без STL никак не обойтись. Вот я и решил напомнить...
эта функция зависит от кодировки, а шаблоны нет
впрочем, собственная ее реализация для шаблона — копеечный вопрос
80% людей оценивают свое мастерство выше среднего...
char * __cdecl strtok (
char * string,
const char * control
)
#endif/* _SECURE_VERSION */
{
unsigned char *str;
const unsigned char *ctrl = control;
unsigned char map[32];
int count;
#ifdef _SECURE_VERSION
/* validation section */
_VALIDATE_RETURN(context != NULL, EINVAL, NULL);
_VALIDATE_RETURN(string != NULL || *context != NULL, EINVAL, NULL);
_VALIDATE_RETURN(control != NULL, EINVAL, NULL);
/* no static storage is needed for the secure version */#else/* _SECURE_VERSION */
_ptiddata ptd = _getptd();
#endif/* _SECURE_VERSION */
/* Clear control map */for (count = 0; count < 32; count++)
map[count] = 0;
/* Set bits in delimiter table */do {
map[*ctrl >> 3] |= (1 << (*ctrl & 7));
} while (*ctrl++);
/* Initialize str */
/* If string is NULL, set str to the saved
* pointer (i.e., continue breaking tokens out of the string
* from the last strtok call) */if (string)
str = string;
else
str = _TOKEN;
/* Find beginning of token (skip over leading delimiters). Note that
* there is no token iff this loop sets str to point to the terminal
* null (*str == '\0') */while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )
str++;
string = str;
/* Find the end of the token. If it is not the end of the string,
* put a null there. */for ( ; *str ; str++ )
if ( map[*str >> 3] & (1 << (*str & 7)) ) {
*str++ = '\0';
break;
}
/* Update nextoken (or the corresponding field in the per-thread data
* structure */
_TOKEN = str;
/* Determine if a token has been found. */if ( string == str )
return NULL;
else
return string;
}
Н>впрочем, собственная ее реализация для шаблона — копеечный вопрос
Здравствуйте, Няшка, Вы писали:
Н>Пихните туда UTF — узнаете
Если доработать так, чтоб '\0' не вставлялось, то и utf переварит спокойно-
сравнение ведь побайтное, и неважно что означают эти байты и совокупности из них.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>В версии на C++ аллоцируется много мутабельных строк, в то время как в версии на Python строки иммутабельные, для них просто берётся view. EP>Плюс, у тебя vector аллоцируется каждый раз создаётся заново, а нужно создать его только один раз и переиспользовать его capacity многократно.
Может быть дело еще и в ifstream. Возможно там буферизация реализована хуже чем в питоне (я не проверял).
Здравствуйте, Няшка, Вы писали:
Н>1. Vector — это шаблон
Vector-это контейнер, обобщённый с помощью шаблонов.
Н>2. Рост которого не всегда сопровождается копированием данных — зависит от реализации и аллокатора
У аллокатора только спрашивают указатель, вызывая его allocate, и ему же велят удалять кусок памяти, вызывая его deallocate. Всё.
С самим данныи контейнер делает что ему хочется. И vector, если вновь помещаемые данные превысят имеющийся объём,
вызывает allocate, копирует в новый буфер предыдущий, и вызывает deallocate предыдущему.
Н>3. Если Вы работаете не только с однобайтовым английским языком, то создать хороший текстовый парсер не на шаблонах будет тугой задачей Н>4. Читать весь файл csv в память и разбивать терминатором, чтобы потом копировать memcpy/strcpy — это бредовая идея для домашнего программирования. Н> Подумайте внимательно, как будет работать Ваше решение на большом файле?..
А никто и не спорит про большие файлы. Большие файлы никто копировать в ram и не собирался, не надо капитанить.
Приведённый в треде пример с маппингом и двумя указателями известен всем страждущим. Только в контексте задачи TC,
всё это тут накручивать будет лишним. Речь изначально велась об ускорении работы приложения.
И парсинг побайтовым сравнением можно проводить на тексте любой кодировки. Шаблон понадобится для определения конкретной специфики
сравнения при поиске, и выдачи результатов. И всё спокойно проделывается и без задействования контейнеров.
H> а на сервере в несколько потоков?.. Н> Какая будет стратегия на ошибки выделения памяти??? Как будете отдавать процессорное время другим задачам??? Куча не нужных проблем появится.
И чем здесь именно контейнеры на шаблонах обеспечат threading safe? Разруливать всё придётся так же, как и без использования контейнеров.
Здравствуйте, smeeld, Вы писали:
S>Здравствуйте, Няшка, Вы писали:
Н>>2. Рост которого не всегда сопровождается копированием данных — зависит от реализации и аллокатора S>У аллокатора только спрашивают указатель, вызывая его allocate, и ему же велят удалять кусок памяти, вызывая его deallocate. Всё. S>С самим данныи контейнер делает что ему хочется. И vector, если вновь помещаемые данные превысят имеющийся объём, S>вызывает allocate, копирует в новый буфер предыдущий, и вызывает deallocate предыдущему.
если данные не переехали, то их можно и не копировать
Н>>3. Если Вы работаете не только с однобайтовым английским языком, то создать хороший текстовый парсер не на шаблонах будет тугой задачей Н>>4. Читать весь файл csv в память и разбивать терминатором, чтобы потом копировать memcpy/strcpy — это бредовая идея для домашнего программирования. Н>> Подумайте внимательно, как будет работать Ваше решение на большом файле?..
S>А никто и не спорит про большие файлы. Большие файлы никто копировать в ram и не собирался, не надо капитанить. S>Приведённый в треде пример с маппингом и двумя указателями известен всем страждущим. Только в контексте задачи TC,
ТС в глобальном плане задачи не освещал
может он на серваке логи крутить в csv хочет и ищет вариант быстрее...
S>всё это тут накручивать будет лишним. Речь изначально велась об ускорении работы приложения.
Ускорение на 5 кб не имеет значения, любой вариант сгодится. Хоть на регулярках... затраты на современной технике будут копеешные.
Скорость актуальна в бигдата и высоконагруженном программировании.
Сколько миллисекунд там эксель непосредственно будет читать табличку из csv — всем насрать.
S>И парсинг побайтовым сравнением можно проводить на тексте любой кодировки. Шаблон понадобится для определения конкретной специфики S>сравнения при поиске, и выдачи результатов. И всё спокойно проделывается и без задействования контейнеров.
Можно, можно... яйца граблями чесать, но процесс и результат вряд ли будут удовлетворительными.
H>> а на сервере в несколько потоков?.. Н>> Какая будет стратегия на ошибки выделения памяти??? Как будете отдавать процессорное время другим задачам??? Куча не нужных проблем появится.
S>И чем здесь именно контейнеры на шаблонах обеспечат threading safe? Разруливать всё придётся так же, как и без использования контейнеров.
Если бахать всё сразу в память, то конечно тут помочь уже нечем.
80% людей оценивают свое мастерство выше среднего...
PD>>Хм... Что тут зависит от кодировки ?
Н>Пихните туда UTF — узнаете
Вообще-то strtok, как и string.h вообще, не предназначена для того, чтобы работать с UTF. Если UTF сунуть в обычную strlen, то результат, мягко говоря, будет тоже далек от истины. Да и вообще кроме strcpy/strcat мало что будет работать.
Здравствуйте, Няшка, Вы писали:
S>>всё это тут накручивать будет лишним. Речь изначально велась об ускорении работы приложения. Н>Ускорение на 5 кб не имеет значения, любой вариант сгодится. Хоть на регулярках... затраты на современной технике будут копеешные.
Изначально как раз и говорится, что затраты далеко не копеечные.
Н>Скорость актуальна в бигдата и высоконагруженном программировании. Н>Сколько миллисекунд там эксель непосредственно будет читать табличку из csv — всем насрать.
А эксель на атомном планшете? А эксель на мобилке? Поставим туда ксеон для ускорения?