1. keyn5565` 18 28.09.20 11:49 Сейчас в теме
Есть файл CSV. Сделал внешний отчет который формируется по этому файлу. В начале сделал через ТекстовыйДокумент. Но после столкнулся с проблемой производительности. Из за того что размер файла больше 30мб решил доработать чтение csv через ado. Но столкнулся с проблемой. Проблема заключается в том что я не могу получить коллекцию колонок из за специфичного содержания файла. Первые две строки содержат разделитель колонок.

Как можно пропустить в ado эти колонки что бы начать чтение строки с 3-й строки?

Код чтения:
Для Каждого Строкамассива из МассивАдресов Цикл
			
			УдалитьФайлы(ВременныйКаталог, "*");
			
			// Временный файл
			id		= id+1;
			ФайлИмя = "КК" + Строка(id) + ".csv";
			Путь    = ВременныйКаталог + ФайлИмя;//ПолучитьИмявременногоФайла(".csv");
			Файл    = ПолучитьИзВременногоХранилища(Строкамассива);
			
			Файл.Записать(Путь);
			
			Сon nectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+ВременныйКаталог+";Extensions=asc,csv,tab,txt;";
						
			Попытка
				// Инициализация основного объекта ADODB.Connection. Открытие соединения.
				ADODBConnection = Новый COMОбъект("ADODB.Connection");
				ADODBConnection.ConnectionString =  СonnectionString;
				ADODBConnection.Open();
				// Импирически определенный параметр для правильного определения количества строк листа.
				ADODBConnection.CursorLocation = 3;    // По-умолчанию 2.
			Исключение
				Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
				Возврат Новый ТаблицаЗначений;    // В случае ошибки возвращаем пустую таблицу значений.
			КонецПопытки;
						
			ТекстЗапроса  = "SEL ECT * FR OM ["+ФайлИмя+"]";
			
			// Создание Recordset. Дочерний объект ADODBConnection. Набор записей по запросу.
			Попытка
				ADODBRecordset = Новый COMОбъект("ADODB.Recordset");
				ADODBRecordset.Open(ТекстЗапроса, ADODBConnection);
				ADODBRecordset.MoveNext();
				ADODBRecordset.MoveNext();
				// Проверка заполненности листа.
				Если (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Тогда
					КолвоСтрокExcel = 0;
					//Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание);
					
					// Завершение работы.
					// Закрытие Объектов.
					ADODBRecordset.Close();
					ADODBConnection.Close();
					ADODBRecordset   = Неопределено;
					ADODBConnection = Неопределено;
					
					Возврат Новый ТаблицаЗначений;    // В случае ошибки возвращаем пустую таблицу значений.
				КонецЕсли;
				// Импирически определенные параметры для правильного определения количества строк листа.
				ADODBRecordset.AbsolutePage     = 1;
				ADODBRecordset.AbsolutePosition = 1;
			Исключение
				Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
				Возврат Новый ТаблицаЗначений;    // В случае ошибки возвращаем пустую таблицу значений.
			КонецПопытки;
			
			// Параметр, возвращаемый в вызывающую процедуру.
			КолвоСтрокExcel = ADODBRecordset.RecordCount + 1;    // (+1) - учет Строки-Заголовока, которая "съедается".
			КолвоКолонокExcel = ADODBRecordset.Fields.Count;
			
		КонецЦикла;
Показать


Содержание файл:
"sep="
" "" "
Колонка1Колонка2Колонка3Колонка4

"sep" - это символ разделителя
По теме из базы знаний
Найденные решения
84. herfis 498 28.09.20 14:00 Сейчас в теме
Ну и все равно переделай чтение через ТекстовыйДокумент на через ЧтениеТекста, как я выше писал.
ТекстовыйДокумент заточен на произвольный доступ в памяти для небольших файликов и нелинейно тормозит на больших объемах.
А ЧтениеТекста - человеческое последовательное чтение из файла, производительность которого зависит от размеров файла исключительно линейно.
keyn5565`; nomad_irk; +2 Ответить
102. herfis 498 29.09.20 11:45 Сейчас в теме
(86) Это на тестовом файле проблема производительности не в этом. Но он же и файлы побольше собирался грузить. Поэтому эта оптимизация в любом случае будет не лишней, о чем я и написал. Это даже не оптимизация. Это просто использование надлежащего инструмента. А для оптимизации производительности на тестовом файле я еще в (38) соглашался, что необходимо оптимизировать преобразование типов.
keyn5565`; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. herfis 498 28.09.20 12:37 Сейчас в теме
(1)
В начале сделал через ТекстовыйДокумент.

Просто сделай через ЧтениеТекста
8. keyn5565` 18 28.09.20 12:38 Сейчас в теме
(7)
иеТек

этот вариант реализован. но формирование отчета может занимать до 10-20 минут
12. herfis 498 28.09.20 12:45 Сейчас в теме
(8) И что же является узким местом? Неужели ПрочитатьСтроку()?
15. keyn5565` 18 28.09.20 12:51 Сейчас в теме
(12) размер файла
долго обрабатывает каждую стоку
16. TODD22 18 28.09.20 12:52 Сейчас в теме
(15)
долго обрабатывает каждую стоку

Что именно делает?

Может у вас после чтения строки идёт обработка его значений, с поиском данных в базе, со сравнением по нескольким полям, да ещё и строковых типов.
keyn5565`; +1 Ответить
19. keyn5565` 18 28.09.20 12:54 Сейчас в теме
(16)

Для Каждого Строкамассива из МассивАдресов Цикл
			
			// Временный файл
			Путь    = ПолучитьИмявременногоФайла(".csv");
			Файл    = ПолучитьИзВременногоХранилища(Строкамассива);
			Файл.Записать(Путь);
			
			Разделитель = Символ("01");//",";
			
			ИмяФайла = Путь;	
			
			// чтение файла
			ЗагружаемыйФайл = Новый ТекстовыйДокумент;
			ЗагружаемыйФайл.Прочитать(ИмяФайла, КодировкаТекста.ANSI);
			
			//шапка по умолчанию 1 строка, из первой строки делаем колонки таблицы
			Шапка = ЗагружаемыйФайл.ПолучитьСтроку(3);
			
			//раскладываем строку в массив
			МассивКолонок = РазложитьСтрокуВМассивПодстрок(Шапка,Разделитель);
			
			//генерируем колонки	
			Для Каждого ИмяКолонки Из МассивКолонок Цикл
				
				ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); // убираем из имени колонок пробелы
				
				Str1 = ИмяБезПробелов;
				ИмяБезПробелов = RegExp.Replace(Str1, "");
				
				ИмяБезПробелов = ИсправлениеЛатиницыНаКирилицу(ИмяБезПробелов);
				
				Если ТаблицаЗаполнения.Колонки.Найти(ИмяБезПробелов) = Неопределено Тогда
					
					Попытка 
						Заголовок	 = ИсправлениеЛатиницыНаКирилицу(ИмяКолонки);
						Имя			 = ИмяБезПробелов;
						ТипЗначения	 =  УстановитьТипКолонки(ИмяБезПробелов);
						ТаблицаЗаполнения.Колонки.Добавить(Имя, ТипЗначения, Заголовок);  
					Исключение
						сообщить(Имяколонки) ;
						сообщить(ИмяБезПробелов) ;
						Продолжить
					Конецпопытки;
					
				КонецЕсли;
				
			КонецЦикла;
			КоличествоСтрок = ЗагружаемыйФайл.КоличествоСтрок();				
			Для НомерСтроки=4 по КоличествоСтрок Цикл
				
				//Состояние("Чтение файла отчета " + Строка(НомерСтроки) + " из " + Строка(ЗагружаемыйФайл.КоличествоСтрок()));
				
				// получить строку файла с указанным номером и преобразуем её в массив
				Строка = ЗагружаемыйФайл.ПолучитьСтроку(НомерСтроки);
				МассивКолонок = РазложитьСтрокуВМассивПодстрок(Строка,Разделитель);
				НоваяСтрока = ТаблицаЗаполнения.Добавить();
				
				Если МассивКолонок.Количество() <> ТаблицаЗаполнения.Колонки.Количество() Тогда
					//Сообщить("Ошибка со строкой " + Строка);
					Продолжить; // скорее всего в тексте содержит разделитель
				КонецЕсли;
				
				Для НомерКолонки = 1 по МассивКолонок.Количество() Цикл 
					//заполняем строку значениями
					ТекущееЗначение = СокрЛП(МассивКолонок[НомерКолонки-1]);
					ИмяКолонки = ТаблицаЗаполнения.Колонки[НомерКолонки-1].Имя; 			
					НоваяСтрока[ИмяКолонки] = ПривестиЗначениекТипу(ТекущееЗначение, ИмяКолонки);			
				КонецЦикла;   		
				
				Процент	 = Цел(НомерСтроки/КоличествоСтрок*100);
				
			КонецЦикла;
			
		КонецЦикла;
Показать
21. herfis 498 28.09.20 12:57 Сейчас в теме
22. keyn5565` 18 28.09.20 12:58 Сейчас в теме
(16)
я в начале преобразую файл в таблицу значений
при чтении лишь преобразую в примитивные типы число, строка, булево
ссылочные типы на этом этапе не использую
23. TODD22 18 28.09.20 12:59 Сейчас в теме
(22)Что там с замером?
keyn5565`; +1 Ответить
24. keyn5565` 18 28.09.20 13:00 Сейчас в теме
(23) все еще замеряет
не отработало пока
25. keyn5565` 18 28.09.20 13:06 Сейчас в теме
(23)
Прикрепленные файлы:
26. TODD22 18 28.09.20 13:08 Сейчас в теме
(25)Вот первые две строки и думайте как оптимизировать.
keyn5565`; +1 Ответить
27. TODD22 18 28.09.20 13:11 Сейчас в теме
(25)Что у вас в функции "ПривестиЗначениеКТипу" ?
keyn5565`; +1 Ответить
29. keyn5565` 18 28.09.20 13:13 Сейчас в теме
(27)
кастыли
Функция ПривестиЗначениекТипу(ТекущееЗначение, ИмяКолонки)
	
	ТипКолонки = УстановитьТипКолонки(ИмяКолонки);
	
	Если ТипКолонки.СодержитТип(Тип("Дата")) Тогда
		Возврат ПолучитьДатуИзСтроки(ТекущееЗначение);
	ИначеЕсли ТипКолонки.СодержитТип(Тип("Число")) Тогда
		Возврат Число(ТекущееЗначение)	                                                                                      
	Иначе
		Возврат ТекущееЗначение 	
	КонецЕсли;
	
КонецФункции
Показать
31. TODD22 18 28.09.20 13:14 Сейчас в теме
(29)Сделайте замер в этой фунцкии.

Предположу что тормозить будет "ПолучитьДатуИзСтроки" и "УстановитьТипКолонки".
28. herfis 498 28.09.20 13:13 Сейчас в теме
(25) Сними внизу галку "Для вызова процедур и функций включать время выполнения" и покажи результат.
120 колонок, что ли?
32. keyn5565` 18 28.09.20 13:15 Сейчас в теме
(28)
Прикрепленные файлы:
34. TODD22 18 28.09.20 13:17 Сейчас в теме
(32)Ну вот и результат совсем другой теперь....
Или в первой строке функция формирования отчета это и есть функция в которой все остальные выполняются?
36. herfis 498 28.09.20 13:23 Сейчас в теме
(32) Сколько времени заняло формирование отчета? Судя по замеру - минуты две с половиной. Так и было?
37. keyn5565` 18 28.09.20 13:24 Сейчас в теме
(36)
я взял файл поменьше, 5 минут формирует
большой минут 20 формирует
40. nomad_irk 72 28.09.20 13:28 Сейчас в теме
(37)94 секунды в замере, откуда 300(5 минут) секунд берется?
46. herfis 498 28.09.20 13:32 Сейчас в теме
(37) 5 минут? По результатам замера вдвое меньше. Тогда либо замер врет, либо ты чего-то недосмотрел. Попробуй натыкать отладочных сообщений с точностью до миллисекунд, чтобы разобраться куда недостающее время пришлось.
48. TODD22 18 28.09.20 13:33 Сейчас в теме
(46)
5 минут?

Да это просто скорее всего субъективная оценка. Типа как бух говорит что раньше работало в 5 раз быстрее. Без точных цифр. А восприятие времени субьективно.
30. nomad_irk 72 28.09.20 13:14 Сейчас в теме
(25)Что внутри УстановитьТипКолонки() и ПривестиЗначениекТипу()?
33. keyn5565` 18 28.09.20 13:17 Сейчас в теме
(30)
Функция ПривестиЗначениекТипу(ТекущееЗначение, ИмяКолонки)
	
	ТипКолонки = УстановитьТипКолонки(ИмяКолонки);
	
	Если ТипКолонки.СодержитТип(Тип("Дата")) Тогда
		Возврат ПолучитьДатуИзСтроки(ТекущееЗначение);
	ИначеЕсли ТипКолонки.СодержитТип(Тип("Число")) Тогда
		Возврат Число(ТекущееЗначение)	                                                                                      
	Иначе
		Возврат ТекущееЗначение 	
	КонецЕсли;
	
КонецФункции

&НаСервере
Функция УстановитьТипКолонки(ИмяКолонки)
	
	Если Найти(НРег(ИмяКолонки), "сумма") <> 0 
		ИЛИ Найти(НРег(ИмяКолонки), "стоимо") <> 0 Тогда
		Возврат ПолучитьОписаниеТиповЧисла(18,2);
	ИначеЕсли Найти(НРег(ИмяКолонки), "дата") <> 0 Тогда
		Возврат ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата); 
	Иначе
		Возврат ПолучитьОписаниеТиповСтроки(300)
	Конецесли;
	
КонецФункции
Показать
35. nomad_irk 72 28.09.20 13:22 Сейчас в теме
(33) Что внутри УстановитьТипКолонки()?
39. TODD22 18 28.09.20 13:27 Сейчас в теме
(33)Или "Найти" или "ПолучитьОписаниеТипов".

Описание типов надо для каждой строки получать?
42. keyn5565` 18 28.09.20 13:28 Сейчас в теме
43. TODD22 18 28.09.20 13:29 Сейчас в теме
(42)Строки или колонки? У вас в строках могут в одной колонке быть разные типы?
44. nomad_irk 72 28.09.20 13:30 Сейчас в теме
(39) Лично я вообще не понимаю, для чего внутри ПривестиЗначениекТипу() опять использовать УстановитьТипКолонки(). Внутренностей УстановитьТипКолонки() мы, похоже так и не увидим и именно в ней каким-то чудесным образом происходит определение типа значения, когда тип этого значения должен быть жестко задан для каждой колонки еще на этапе проектирования/формирования файла *.csv.
49. keyn5565` 18 28.09.20 13:35 Сейчас в теме
(44)
1. Получаем из строки список колонок
2. Раскладываем в массив подстрок
3. Приводим колонку к нужному типу при помощи УстановитьТипКолонки()
4. После сформированной но пустой таблицы заполняем значениями
5. раз у нас уже есть описание типов в колонке приводим значение к нужному типу ПривестиЗначениекТипу()
50. TODD22 18 28.09.20 13:37 Сейчас в теме
(49)
5. раз у нас уже есть описание типов в колонке приводим значение к нужному типу

Вот тут у вас и тормозит. вы что то не то делаете похоже.
51. nomad_irk 72 28.09.20 13:37 Сейчас в теме
(49)Так на кой еще раз определять тип значения колонки каким-то чудесным образом, с помощью УстановитьТипКолонки(), если у колонки ТЗ уже тип определен этим самым УстановитьТипКолонки() в момент добавления колонки в ТЗ?
keyn5565`; +1 Ответить
53. TODD22 18 28.09.20 13:39 Сейчас в теме
(51)Похоже просто для каждой строки получают значение.
55. nomad_irk 72 28.09.20 13:40 Сейчас в теме
(53)Для каждой колонки в строке определяют тип и приводят к этому типу. ЗАЧЕМ?
54. keyn5565` 18 28.09.20 13:39 Сейчас в теме
(51)
Каждое значение имеет тип "Строка". Но нужно её привести к значению Числа (для расчета итогов в СКД) и Дата
56. TODD22 18 28.09.20 13:41 Сейчас в теме
(54)
Каждое значение имеет тип "Строка". Но нужно её привести к значению Числа (для расчета итогов в СКД) и Дата

Так и приводи значение к нужному, зачем там определение типа колонки?
57. nomad_irk 72 28.09.20 13:41 Сейчас в теме
(54)В число оно и так преобразуется, если вы сделаете ТЗ.КолонкаЧисло = "СтрокаСЧислом"
keyn5565`; +1 Ответить
52. TODD22 18 28.09.20 13:39 Сейчас в теме
(44)
Внутренностей УстановитьТипКолонки()

Есть там выше. Там поиск по подстроке и получение типа. Вот что то из этого тормозит, но всё же не понятно зачем для строки вызывать установку типа колонки, когда надо значение строки преобразовать к нужному типу.
58. nomad_irk 72 28.09.20 13:42 Сейчас в теме
(52)Покажи, где есть внутренности УстановитьТипКолонки()?
59. TODD22 18 28.09.20 13:43 Сейчас в теме
(58) В 33 сообщении разверни код.
61. nomad_irk 72 28.09.20 13:44 Сейчас в теме
(59)Хорошо. Не заметил, или уже позже добавили.
keyn5565`; +1 Ответить
62. keyn5565` 18 28.09.20 13:45 Сейчас в теме
(58)
УстановитьТипКолонки


&НаСервере
Функция УстановитьТипКолонки(ИмяКолонки)
	
	Если Найти(НРег(ИмяКолонки), "сумма") <> 0 
		ИЛИ Найти(НРег(ИмяКолонки), "стоимо") <> 0 Тогда
		Возврат ПолучитьОписаниеТиповЧисла(18,2);
	ИначеЕсли Найти(НРег(ИмяКолонки), "дата") <> 0 Тогда
		Возврат ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата); 
	Иначе
		Возврат ПолучитьОписаниеТиповСтроки(300)
	Конецесли;
	
КонецФункции
Показать
63. TODD22 18 28.09.20 13:46 Сейчас в теме
(62)
ПолучитьОписаниеТиповДаты(ЧастиДаты.Дата);

Вот это тебе зачем на каждой итерации делать?

У тебя в строке есть дата вида "1999-12-10" ты приводишь это к дате с помощью функции "Дата", зачем определение типа делать каждый раз?
69. keyn5565` 18 28.09.20 13:50 Сейчас в теме
(63)
Вот это тебе зачем на каждой итерации делать?

"10-09-2019" не прокатит
72. TODD22 18 28.09.20 13:51 Сейчас в теме
(69)
"10-09-2019" не прокатит

Что значит "не прокатит" ?
75. keyn5565` 18 28.09.20 13:51 Сейчас в теме
(72)
Дата("10-09-2019") Преобразование значения к типу Дата не может быть выполнено
если я вас правильно понял
77. TODD22 18 28.09.20 13:52 Сейчас в теме
(75)
Дата("10-09-2019") Преобразование значения к типу Дата не может быть выполнено

Преобразование делается не так. Это я как пример привёл что дату можно преобразовать функцией Дата, в СП можно почитать.
65. nomad_irk 72 28.09.20 13:47 Сейчас в теме
(62)У вас количество колонок в разных файлах разное?
Это делается вручную, при формировании структуры ТЗ, в которую вы будете загружать файл.
keyn5565`; +1 Ответить
67. keyn5565` 18 28.09.20 13:49 Сейчас в теме
(65)
в каждом файле разные
68. TODD22 18 28.09.20 13:49 Сейчас в теме
(67)
в каждом файле разные

Так вы и делайте это для файла, а не для строк в файле.
74. nomad_irk 72 28.09.20 13:51 Сейчас в теме
(67)ну хорошо, разное количество колонок в разных файлах.

Уберите вы УстановитьТипКолонки() из ПривестиЗначениекТипу(ТекущееЗначение, ИмяКолонки),
в качестве второго параметра передавайте ТипЗначения к которому нужно приводить, используя тип значения колонки ТЗ.

Приводить строку нужно к дате, число само из строки приведется.

Вот строку из числа необходимо преобразовывать, если разделители разрядов ненужны(а они по-хорошему не нужны).
70. TODD22 18 28.09.20 13:50 Сейчас в теме
(65)
У вас количество колонок в разных файлах разное?

Да пусть разное, тут похоже для каждой строки и для каждого значения функция вызывается. В этом и проблема.
76. nomad_irk 72 28.09.20 13:51 Сейчас в теме
78. keyn5565` 18 28.09.20 13:53 Сейчас в теме
(76)
ясно, буду оптимизировать это
80. TODD22 18 28.09.20 13:54 Сейчас в теме
(78)
ясно, буду оптимизировать это

С начало сделайте замер и проверьте что в этой функции выполняется долго, поиск через "Найти" или "ПолучитьОписаниеТипов".

Как минимум описание типов можно оптимизировать тем что каждый раз вы не получаете значение, а получаете все три типа до начала обхода столбцов и строк и потом просто подставляете нужный.
Может конечно ошибаюсь, но "ПолучениеОписанияТипов" для каждой строки делать не надо.
66. TODD22 18 28.09.20 13:49 Сейчас в теме
(62)Сделай замер в этой функции.

Работает долго либо "Найти" с приведением к нижнему регистру, либо "ПолучитьОписаниеТиповДаты".

По поводу колонок, эти имена "сумма", "стоимо" и тд это имена каких колонок? ТЗ или CSV ?
71. keyn5565` 18 28.09.20 13:50 Сейчас в теме
(66)
в csv это постоянные колонки
73. TODD22 18 28.09.20 13:51 Сейчас в теме
(71)Тем более. Зачем их каждый раз искать? На каждой итерации цикла.
79. nomad_irk 72 28.09.20 13:53 Сейчас в теме
(66)В *.csv их так называют причем с пробелами.
keyn5565`; +1 Ответить
20. nomad_irk 72 28.09.20 12:55 Сейчас в теме
(15)Избавьтесь от синхронности действий, читайте файл в ТЗ, а дальше уже работайте с ТЗ, используя ее в качестве параметра запроса, чтобы найти необходимые объекты ссылочного типа.
14. TODD22 18 28.09.20 12:48 Сейчас в теме
(8)
этот вариант реализован. но формирование отчета может занимать до 10-20 минут

Сделайте замер производительности и покажите статистику работы функций.

30Мб и 8К строк это очень мало.
17. keyn5565` 18 28.09.20 12:53 Сейчас в теме
(14)
8К строк это очень мало.

это я малый файл взял для тестирования
а так основной фал 53 мб
поставил на замер
18. TODD22 18 28.09.20 12:53 Сейчас в теме
(17)
а так основной фал 53 мб

Это то же небольшой размер файла.
keyn5565`; +1 Ответить
2. VictorRGB2 13 28.09.20 12:21 Сейчас в теме
как-то так
НомерТекущейСтроки = 1;
    Пока ADODBRecordset.EOF() = 0 Цикл    
        НомерТекущейСтроки = НомерТекущейСтроки + 1;
        Если НомерТекущейСтроки < 4 Тогда // пропускаем первые 3 строки
            ADODBRecordset.MoveNext();  
            Продолжить;
        КонецЕсли;

// продолжаем чтение данных с 4-ой строки
Показать
3. keyn5565` 18 28.09.20 12:27 Сейчас в теме
(2)
ADODBRecordset.EOF()

зацикливает из за
 Пока ADODBRecordset.EOF() = 0 Цикл
4. VictorRGB2 13 28.09.20 12:32 Сейчас в теме
(3)EOF() - возвращает истину, если текущая позиция записи после последней записи, в противном случае ложь
попробуйте через
Пока НЕ ADODBRecordset.EOF() Цикл

еще можно проверить сколько всего записей в данных и сделать цикл по найденному числу
RecordCount() - возвращает количество записей в объекте Recordset
5. keyn5565` 18 28.09.20 12:34 Сейчас в теме
(4)
Пока НЕ ADODBRecordset.EOF() Цикл


после остановки цикла НомерТекущейСтроки содержал более 300000
RecordCount - содержит верное количество записей
ADODBRecordset.Fields.Count содержит всего 1
6. VictorRGB2 13 28.09.20 12:36 Сейчас в теме
(5) значит у вас реально столько строк в файле ))
10. keyn5565` 18 28.09.20 12:39 Сейчас в теме
(6)
значит у вас реально столько строк в файле ))

в файле всего 8000 строк
9. VictorRGB2 13 28.09.20 12:38 Сейчас в теме
(5) а ADODBRecordset.Fields.Count вернет вам не число записей в данных, а число полей в коллекции, т.е. у вас всего ОДНО поле в каждой записи
11. keyn5565` 18 28.09.20 12:43 Сейчас в теме
(9)
его ОДНО поле в каждой зап

это поле "sep=" которое возвращает
я просто не знаю как его пропустить
13. VictorRGB2 13 28.09.20 12:47 Сейчас в теме
(11) Fields. Item(Х) - где Х позиция поля
или
Fields. Item("ИмяПоля") - где ИмяПоля наименование поля
но тут надо знать точно или номер позиции поля или его имя в коллекции, тогда можно его пропустить по условию
38. herfis 498 28.09.20 13:27 Сейчас в теме
(37) Не, я просто про соответствие реальности результатам замера. Если так и было, тогда явных узких мест нет. Просто накладные расходы на преобразование типов для большого количества строк и колонок. Но ADO же тоже строки вернет и нужно будет делать те же самые преобразования? Тогда где ожидаемый выигрыш? Тогда оптимизировать надо не метод чтения, а способ преобразования типов.
41. TODD22 18 28.09.20 13:28 Сейчас в теме
(38)
Тогда где ожидаемый выигрыш?

Так его и не будет. Без замера производительности оптимизацией заниматься.... круто....
45. keyn5565` 18 28.09.20 13:30 Сейчас в теме
(38)
Не, я просто про соответствие реальности результатам замера. Если так и было, тогда явных узких мест нет. Просто накладные расходы на преобразование типов для большого количества строк и колонок. Но ADO же тоже строки вернет и нужно будет делать те же самые преобразования? Тогда где ожидаемый выигрыш?


надеялся на ускорить заполнение ТЗ ускорить. В теории ADO могло помочь. Но пока застрял.
47. TODD22 18 28.09.20 13:32 Сейчас в теме
(45)
надеялся на ускорить заполнение ТЗ ускорить

У вас проблема в двух строках кода, как вам ADO решит эту проблему? Вы не будете выполнять этот код если будет ADO ?
60. user1407549 1 28.09.20 13:43 Сейчас в теме
Если Вам передают даже символ разделителя, значит, содержание и формат файла обмена КАК-ТО, КЕМ-ТО определен? Или нет? Если да, создайте в начале процедуры ТЗ с нужными типами колонок и не тратьте время на типизацию для каждой строки
keyn5565`; +1 Ответить
64. keyn5565` 18 28.09.20 13:47 Сейчас в теме
(60)
Если Вам передают даже символ разделителя, значит, содержание и формат файла обмена КАК-ТО, КЕМ-ТО определен? Или нет? Если да, создайте в начале процедуры ТЗ с нужными типами колонок и не тратьте время на типизацию для каждой строки

Определен налоговой, литература отсутствует. Приходится придумывать велосипед
81. keyn5565` 18 28.09.20 13:55 Сейчас в теме
НоваяСтрока[ИмяКолонки] = ПривестиЗначениекТипу(ТекущееЗначение, ИмяКолонки);	

Самый время-затратный
82. TODD22 18 28.09.20 13:56 Сейчас в теме
(81)
Самый время-затратный

Внутри функции "ПривестиЗНачениеКТипу" какие строки самые затратные?
83. keyn5565` 18 28.09.20 13:57 Сейчас в теме
(82)
ипу" какие строки самые затра


Возврат ПолучитьОписаниеТиповСтроки(300)

подавляющее большинство имеет строчный тип
85. TODD22 18 28.09.20 14:32 Сейчас в теме
(83)
Возврат ПолучитьОписаниеТиповСтроки(300)

Перепиши что бы на каждой строке документа не получать описание типов. Оно для строк тебе не нужно. Ты для колонки тип указал и всё, дальше свои значения преобразуй в строки, даты, числа и пиши в колонки.
84. herfis 498 28.09.20 14:00 Сейчас в теме
Ну и все равно переделай чтение через ТекстовыйДокумент на через ЧтениеТекста, как я выше писал.
ТекстовыйДокумент заточен на произвольный доступ в памяти для небольших файликов и нелинейно тормозит на больших объемах.
А ЧтениеТекста - человеческое последовательное чтение из файла, производительность которого зависит от размеров файла исключительно линейно.
keyn5565`; nomad_irk; +2 Ответить
86. TODD22 18 28.09.20 14:33 Сейчас в теме
(84)И не важно что проблема не в скорости чтения файла.
87. nomad_irk 72 28.09.20 14:48 Сейчас в теме
(86)про ЧтениеТекста вместо ТекстовыйДокумент: в текстовый документ ты большой файл можешь и не загрузить, т.к. закончится ОЗУ, а ЧтениеТекста спокойно прочитает весь текст.
keyn5565`; +1 Ответить
88. TODD22 18 28.09.20 14:50 Сейчас в теме
(87)Я про то что в данном конкретном случае проблема не в этом.

Приходишь ты к врачу, зуб болит, а тебе за одно гипс на руку накладывают.
89. nomad_irk 72 28.09.20 14:52 Сейчас в теме
(88)Да потому что все равно код править.....
90. keyn5565` 18 28.09.20 15:17 Сейчас в теме
(87)

87. nomad_irk 49 28.09.20 14:48 Сейчас в теме
(86)про ЧтениеТекста вместо ТекстовыйДокумент: в текстовый документ ты большой файл можешь и не загрузить, т.к. закончится ОЗУ, а ЧтениеТекста спокойно прочитает весь текст.


Уже переписал. Благо там все просто. Скорости не то что бы много прибавило, но нагрузка с сервера упала значительно.
91. TODD22 18 28.09.20 15:18 Сейчас в теме
(90)
Уже переписал.

Так что там с определением типов ?
92. keyn5565` 18 28.09.20 15:20 Сейчас в теме
(91)
Так что там с определением типов ?


Переработал "ПривестиЗначениекТипу" исправил свою тупость в виде "УстановитьТипКолонки()" из за которой тормозило.
93. TODD22 18 28.09.20 15:21 Сейчас в теме
(92)И? Работать то лучше стало или нет?
94. keyn5565` 18 28.09.20 15:22 Сейчас в теме
97. TODD22 18 28.09.20 15:24 Сейчас в теме
(94)На сколько лучше? Теперь за приемлемое время отрабатывает?
99. keyn5565` 18 28.09.20 15:25 Сейчас в теме
(97)
На сколько лучше? Теперь за приемлемое время отрабатывает?

Если объективно судить то скорость поднялась на 60%
100. TODD22 18 28.09.20 15:26 Сейчас в теме
(99)
Если объективно судить то скорость поднялась на 60%

Если ещё надо оптимизировать то делайте ещё один замер, смотрите ещё длительные операции. Можно наверное ещё ускорить.

Выложите замер, интересно посмотреть на что теперь уходит время.
101. keyn5565` 18 28.09.20 15:27 Сейчас в теме
102. herfis 498 29.09.20 11:45 Сейчас в теме
(86) Это на тестовом файле проблема производительности не в этом. Но он же и файлы побольше собирался грузить. Поэтому эта оптимизация в любом случае будет не лишней, о чем я и написал. Это даже не оптимизация. Это просто использование надлежащего инструмента. А для оптимизации производительности на тестовом файле я еще в (38) соглашался, что необходимо оптимизировать преобразование типов.
keyn5565`; +1 Ответить
95. keyn5565` 18 28.09.20 15:22 Сейчас в теме
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот