Интерфейс kdb c++: создать список байтов из std::string

Следующее очень медленно для длинных строк:

std::string s = "long string";
K klist = DBVec::CreateList(KG , s.length());
for (int i=0; i<s.length(); i++)
{
    kG(klist)[i]=s.c_str()[i];
}

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

Вопрос: учитывая блок двоичных данных в виде std::string, каков эффективный способ построения списка байтов?


person user443854    schedule 08.01.2014    source источник


Ответы (2)


kG — это макрос, определенный в k.h, который расширяется до ((x)->G0), т.е. следуйте указателю G0 объекта K

http://kx.com/q/d/a/c.htm#Strings документирует kp, который создает объект строки K непосредственно из строки, поэтому, предположительно, вы могли бы сделать K klist = kp(s.c_str()), что, вероятно, быстрее

person Aaron Davies    schedule 09.01.2014

Это работает:

memcpy(kG(klist), s.c_str(), s.length());

Все еще удивляюсь, почему этот цикл не O (N).

person user443854    schedule 09.01.2014