AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 10.03.2009, 09:14   #1  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Особенности поведения str
Обнаружил интересные вещи. В AX4, как оказалось, размер str ограничен загадочным образом:
X++:
    int i,j;

    str  s;
    str s2;
    SysOperationProgress p = new SysOperationProgress();
    ;



    try
    {

        while (i <= 140000000)
        {
            i += 1000;

            j =strlen(s);

            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";
            s += "абвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзийабвгдежзий";

            s2 = s;

            p.setText(strfmt("%1", strlen(s)));
        }
    }
    catch
    {
        info(strfmt("last %1", j));
    }
Аксапта в некоторый момент выдает: "Недостаточно памяти для исполнения кода".
Момент этот зависит от количества знаков в строке. То есть при превышении некоторого количества знаков в строке, с ней невозможно производить никаких операций. Допустимое количество знаков зависит, вероятно, от количества свободной памяти в системе. У меня падает обычно примерно на 4000000 символов. Однажды упало где-то на 2000000. Опять же, значение не фиксировано, может меняться, но колеблется в этом районе. Для себя я решил, что надежное значение - 1000000 символов.

Дальше, нельзя выставить размер строки больше 1000 символов:
X++:
str 2000 s;
В отладчике можно увидеть, что до присвоения какого-либо значения переменной размер ее не определен. В момент присвоения размер устанавливается (если было указано больше 1000) в 1000 символов. Разумеется, если присваемое значение имеет длину более 1000 символов, то с оставшейся частью строки можно попрощаться.

В AX3 дела обстоят уже лучше. Размер строки не ограничивается. Во всяком случае, я не дождался окончания работы вышеуказанного джоба.
Но также нельзя объявлять строки больше 1000 символов - режутся как и в 4-ке.
Кроме того, при передачи строк большого размера от сервера к клиенту, тот принудительно обрывает связь.

Еще одна особенность - по мере роста строки затрачивается все больше времени на его модификацию. Непонятно почему, strlen занимает много времени.

Вот такие дела... Из-за ограничения размера str, кстати, падают некоторые ресурсоемкие операции.
Старый 10.03.2009, 09:49   #2  
Bober is offline
Bober
Участник
 
311 / 104 (4) +++++
Регистрация: 29.05.2007
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Из-за ограничения размера str, кстати, падают некоторые ресурсоемкие операции.
какие именно ? ( есть подозрение что Вы занимаетесь ненужными исследованиями )
Старый 10.03.2009, 09:51   #3  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
какие именно ? ( есть подозрение что Вы занимаетесь ненужными исследованиями )
Например это Обратная разработка в AX4.
Забыл сказать, что все что касается str, можно отнести и к TextBuffer.
или это Классы для генерации отчетов в Excel
Еще что-то подобное, хотя там - контейнер.
Не идет выгрузка компании
Возможно выплывет еще где-то.

Последний раз редактировалось Eldar9x; 10.03.2009 в 10:18.
Старый 10.03.2009, 10:47   #4  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Обнаружил интересные вещи. В AX4, как оказалось, размер str ограничен загадочным образом:
Строки, как и другие объекты в Java, живут в куче.
размер кучи большой, но ограниченный.
__________________
полезное на axForum, github, vk, coub.
Старый 10.03.2009, 13:43   #5  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
но ограниченный.
по моему это какое-то искуственное ограничение. В тройке ведь не падает.
Старый 10.03.2009, 14:06   #6  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
по моему это какое-то искуственное ограничение. В тройке ведь не падает.
В тройке используется win1251. каждый символ - один байт.
В четверке используется utf16. каждый символ - два байта.

барабашки нет
__________________
полезное на axForum, github, vk, coub.
Старый 10.03.2009, 17:47   #7  
alex55 is offline
alex55
MCTS
MCBMSS
 
224 / 145 (5) +++++
Регистрация: 13.02.2007
Адрес: Москва
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Допустимое количество знаков зависит, вероятно, от количества свободной памяти в системе.
А в вашей тестовой системе была так мало свободной памяти? Возможно это связано с параметрами, которые обсуждались здесь: Падает клиент при прикреплении документа. Жаль, что пока никто пояснения не оставил где же все-таки найти эти ключи или их нужно создавать (впрочем я вроде пробовал, но для работы с большими массивами не сильно помогло - у меня падала работа с textbuffer со строками в несколько MB)..

>>Еще одна особенность - по мере роста строки затрачивается все больше времени на его модификацию. Непонятно почему, strlen занимает много времени.

А точно strlen, а не ресурсоемкая конкатенация строк?
За это сообщение автора поблагодарили: Eldar9x (1).
Старый 10.03.2009, 18:55   #8  
Eldar9x is offline
Eldar9x
MCTS
Аватар для Eldar9x
Oracle
MCBMSS
 
1,064 / 166 (8) ++++++
Регистрация: 29.09.2006
Адрес: Казань
Цитата:
В тройке используется win1251. каждый символ - один байт.
В четверке используется utf16. каждый символ - два байта.
следуя такой логике, тройка должна упасть на 8000000. Ждал до 30000000 - работает нормально.
Цитата:
А в вашей тестовой системе была так мало свободной памяти?
2 гб из 4 гб физической.
Цитата:
А точно strlen, а не ресурсоемкая конкатенация строк?
точно

Вобщем решение в вышеприведенной ссылке было верное. Создаем с помощью конф. утилиты axc файл, открываем блокнотом и прописываем в конце maxbuffersize, text,0.
Все, теперь можно не бояться переполнения.
Старый 11.03.2009, 15:04   #9  
alex55 is offline
alex55
MCTS
MCBMSS
 
224 / 145 (5) +++++
Регистрация: 13.02.2007
Адрес: Москва
Цитата:
Сообщение от Eldar9x Посмотреть сообщение
Вобщем решение в вышеприведенной ссылке было верное. Создаем с помощью конф. утилиты axc файл, открываем блокнотом и прописываем в конце maxbuffersize, text,0.
Все, теперь можно не бояться переполнения.
Попробовал - возникает ошибка в момент присваивания строки более 3MB.. Если пробовать setText сделать с исходной строкой - аналогично.

Ошибка времени выполнения: Недостаточно памяти для исполнения кода.

Трассировка стека

(C)\Jobs\Test_Str_3 - line 13

X++:
static void Test_Str_3(Args _args)
{
    str         s;
    int         i;
    str         res;
    textbuffer  tb = new textbuffer();

    for (i = 1; i<13250; i++)
    {
        s += strrep("a", 1000);
    }

    res = s;

    tb.setText(res);
    tb.toFile("d:\\test1.txt");

    info("Test_Str_3: finished.");
}
DAX 4.0.
Старый 21.05.2009, 14:45   #10  
Deusik is offline
Deusik
Участник
 
5 / 10 (1) +
Регистрация: 22.11.2004
Адрес: Moscow
По ходу в Ax4 SP2 так же дела обстоят и с запросами (не только str и TextBuffer)...., т.е. если слишком много полей в табличках и перечислять поля звездочкой, типа (*), то может возникать ошибка "The query processor could not produce a query plan. For more information, contact Customer Support Services."
это касается и джобиков(by select) и форм, где датасурсы джоунятся... и видимо в запросах, типа Query(не пробовал), так что осторожно с количеством полей в нашем современном мире
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axStart: Always add str tostring() method on your class for debug purpose. Blog bot DAX Blogs 0 20.03.2008 14:05
Изменение поведения lookUp-а на динамическом Control-e... Lemming DAX: Программирование 5 09.06.2005 12:18
Особенности ODBC выборки Александр Костоусов DAX: Программирование 2 12.10.2004 09:46
Особенности импорта из Excel Pegiy DAX: Функционал 0 26.01.2004 16:15
Особенности национальной кухни. Отгрузочная накладная Yrevich DAX: Функционал 8 03.07.2003 19:59

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:25.