| 
			
			 | 
		#1 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
			
			
			Особенности поведения 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;В AX3 дела обстоят уже лучше. Размер строки не ограничивается. Во всяком случае, я не дождался окончания работы вышеуказанного джоба. Но также нельзя объявлять строки больше 1000 символов - режутся как и в 4-ке. Кроме того, при передачи строк большого размера от сервера к клиенту, тот принудительно обрывает связь. Еще одна особенность - по мере роста строки затрачивается все больше времени на его модификацию. Непонятно почему, strlen занимает много времени. Вот такие дела... Из-за ограничения размера str, кстати, падают некоторые ресурсоемкие операции.  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			какие именно ? ( есть подозрение что Вы занимаетесь ненужными исследованиями )
		
	 
Забыл сказать, что все что касается str, можно отнести и к TextBuffer. или это Классы для генерации отчетов в Excel Еще что-то подобное, хотя там - контейнер. Не идет выгрузка компании Возможно выплывет еще где-то. Последний раз редактировалось Eldar9x; 10.03.2009 в 10:18.  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
размер кучи большой, но ограниченный.  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			но ограниченный.
		
	 
 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
В четверке используется utf16. каждый символ - два байта. барабашки нет  
		 | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
>>Еще одна особенность - по мере роста строки затрачивается все больше времени на его модификацию. Непонятно почему, strlen занимает много времени. А точно strlen, а не ресурсоемкая конкатенация строк?  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Eldar9x (1). | |
| 
			
			 | 
		#8 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			В тройке используется win1251. каждый символ - один байт. 
В четверке используется utf16. каждый символ - два байта. Цитата: 
	
		
			А в вашей тестовой системе была так мало свободной памяти?
		
	 
Цитата: 
	
		
			А точно strlen, а не ресурсоемкая конкатенация строк?
		
	 
Вобщем решение в вышеприведенной ссылке было верное. Создаем с помощью конф. утилиты axc файл, открываем блокнотом и прописываем в конце maxbuffersize, text,0. Все, теперь можно не бояться переполнения.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 MCTS 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Ошибка времени выполнения: Недостаточно памяти для исполнения кода. Трассировка стека (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."); }  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			По ходу в Ax4 SP2 так же дела обстоят и с запросами (не только str и TextBuffer)...., т.е. если слишком много полей в табличках и перечислять поля звездочкой, типа (*), то может возникать ошибка "The query processor could not produce a query plan. For more information, contact Customer Support Services." 
		
		
		
		
		
		
		
	это касается и джобиков(by select) и форм, где датасурсы джоунятся... и видимо в запросах, типа Query(не пробовал), так что осторожно с количеством полей в нашем современном мире  
		 | 
| 
	
 |