powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / скорость выгрузки в CSV
19 сообщений из 19, страница 1 из 1
скорость выгрузки в CSV
    #37417140
michaeldevp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Нужно выгрузить данные в CSV формат.

В нескольких больших таблицах - по несколько миллионов записей.

Выгружаю посредством
Set result=##class(%ResultSet).%New("%DynamicQuery:SQL")

Компьютер AMD 2800+, 512M RAM.

Выгружается со скоростью примерно 300 записей в секунду.
Это нормально?

Пробовал посредством прямого доступа к данным (данные в list-е), скорость увеличивается ненамного.

С уважением,
Михаил
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417288
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не показали, как вы выгружаете.
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417313
michaeldevp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блок А.Н.,

Set result=##class(%ResultSet).%New("%DynamicQuery:SQL")
s sqlstr="SELECT * FROM "_ClsName
Set sc=result.Prepare(sqlstr)
If (sc="") Do DisplayError^%apiOBJ(sc) Quit
Set sc=result.Execute() If (sc="") Do DisplayError^%apiOBJ(sc) Quit
While result.Next(.sc) {
If (sc="") Quit
........
тут write в файл
........
}
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417321
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michaeldevp,
Для поиска "узких" мест в коде можно воспользоваться утилитой MONLBL .
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417541
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michaeldevp Set result=##class(%ResultSet).%New("%DynamicQuery:SQL")
s sqlstr="SELECT * FROM "_ClsName

Именно динамический? Версия Каше?

michaeldevp ........
тут write в файл
........

Скрыто самое интересное...
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417556
michaeldevp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
doublefint,

Запрос именно такой, как приведен.
Версия - 5.0.21.6408.0

в цикле идут write-ы по свойствам,типа
w r.Data(PropName)

Главный вопрос: скорость такая - это нормально? хотя бы примерно.
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417736
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michaeldevpскорость такая - это нормально? хотя бы примерно.
А что там в килобайтах получается? Сколько занимают те 300 записей в секунду?

Я бы в качестве теста проверил запись отдельно, без запроса... И вывод данных запроса на тот же экран... Посмотрел время...
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417751
Блок А.Н.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, все ж таки давайте поподробней,
как открываете файл, как пишете, с камими флагами, на какое устройство.

Какая скорость будет самого запроса, если не писать в файл?
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417760
michaeldevp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
5,5 миллионов записей в csv-файле получилось 3,4 гигабайта.
Лимитирует процесс не запись в файл, а запрос.
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417815
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michaeldevp5,5 миллионов записей в csv-файле получилось 3,4 гигабайта.
300 записей в секунду... Это вроде как 185КБ/с получается.
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417829
michaeldevp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

да.
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417890
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас потестил простое копирование в Фаре - 25МБ/с... Т.ч. 185КБ/с это ну ооочень медленно.
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417896
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее это Мбиты были - т.ч. делить на 8 = 3.1МБ/с
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417906
michaeldevp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

Причем тут фар.
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417932
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michaeldevpПричем тут фар.
Ну надо же с чем-то сравнить...
Назовём скорость в Фаре "верхней границей" и будем стремиться её достичь
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37417960
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня вот это

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
	n
	s str=""
	// формируем строку
	s $p(str, 1 , 621 )=""
	s o=##class(%File).%New("d:\box\tmp.txt")
	d o.Open("WSN")
	s t=$h
	for i= 1 : 1 : 300 * 500  {
		d o.WriteLine(str)
	}
	d o.Close()
	s t=$p($h,",", 2 )-$p(t,",", 2 )
	w !,t
	q
Отработало за 2 секунды... Файл получился 89МБ...
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37418071
michaeldevp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krvsa,

У меня лимитирует не запись в файл, а чтение результатов запроса.
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37418368
doublefint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
michaeldevp, еще вариант для вашей версии, но на сложных классах не проверял:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
IncludeGenerator %occInclude

/// Интерфейс для выгрузки в csv
/// Использование - отнаследоваться и вызвать
/// <example> d ..CSVExport()</example>
/// Формат выгрузки: Первая строка - Имена полей через точку запятой
/// Последующие строки - Данные по полям через точку запятой, каждая запись с новой строки
Class CSV.Adaptor [ Abstract ] {

/// Основной метод, ради которого весь сыр-бор
ClassMethod CSVExport() [ CodeMode = generator ] {
 #; проверки и защита
 Q:$$$CLASSabstract($$$gDEF,%class) $$$OK
 Q:'$$$classIsPersistent(%class) $$$OK  
  
 #;Готовим выражение для Select [fields...] Into [vars...]
 s fields="",vars="",count= 0  
 s prop="" for { s prop=$$$defMemberNext(%class,$$$cCLASSproperty,prop) Q:prop=""  
	if $$$PROPtransient($$$gDEF,%class,prop) continue ;возможно нужны еще проверки
    s count=count+ 1  ;количество свойств
 	s:fields'="" fields=fields_"," ;список полей через запятую  
	s:vars'="" vars=vars_"," ;список переменных через запятую
    s field=prop, sqlfld=$$$PROPsqlfieldname($$$gDEF,%class,prop)
    s:sqlfld'="" field=sqlfld ;переопределяем имя свойства именем поля, если необходимо
    s fields=fields_field, vars=vars_":fld"_count ;собираем списки
 }

 #;Разбираемся с именем таблицы - кто нить знает "правильный" способ?
 #; тут м.б проблемы из-за настройки, разрешающей точку в имени таблицы
 s sqltable=$$$CLASSsqltablename($$$gDEF,%class)
 s deep=$l(%class,"."), package=$p(%class,".", 1 ,deep- 1 ), class=$p(%class,".",deep) 
 s:sqltable'="" class=sqltable ;Вот тут проблемы
 s package=$tr(package,".","_")
 #;Контролируем пакет User
 s firstPackage=$p(%class,".") s:firstPackage="User" package="SQL"_package
 s table=package_"."_class

 #; Отладка
 w !,"CSVExport: Select "_fields
 w !,"CSVExport: INTO "_vars
 w !,"CSVExport: FROM "_table

 #; Пишем в код
 s %code= 0 
 #;выводим заголовок csv
 $$$GENERATE("  w """_$tr(fields,",",";")_""" ")	 
 #;генерируем запрос, имя курсора в классе д.б. уникально 
 $$$GENERATE("  &sql(DECLARE csvrs CURSOR FOR ")
 $$$GENERATE("  Select "_fields_" INTO "_vars_" FROM "_table_")  ")
 $$$GENERATE("  &sql(OPEN csvrs) ")
 $$$GENERATE("  for { &sql(FETCH csvrs) Q:SQLCODE ")
 $$$GENERATE("  	w ! ")
 for fi= 1 : 1 :count {
   if fi> 1  $$$GENERATE("	  w "";""  ")	 
   $$$GENERATE("	  w $tr(fld"_fi_",$c(13,10,59),$c(32)) ")
 }
 $$$GENERATE("  } ")
 $$$GENERATE("  &sql(CLOSE csvrs) ")
 $$$GENERATE("  Q $$$OK " )
 w ! zw %code
 Q $$$OK
}

}
...
Рейтинг: 0 / 0
скорость выгрузки в CSV
    #37418500
Turk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
michaeldevp5,5 миллионов записей в csv-файле получилось 3,4 гигабайта.
Лимитирует процесс не запись в файл, а запрос.
1. Если Вы уверены, что виноват запрос, то попробуйте его выполнить в Портале управления (или в SQL-менеджере, если у Вас Cache 5.0 или ниже) и зафиксируйте время выполнения. Если время будет близко в Вашему, то посмотрите план запроса - возможно оптимизатор пытается использовать индекс (что совершенно бессмысленно для полного перебора) - иногда добавление условия "(%ID > 0)" помогает уйти от использования индексов.
2. В указанной таблице есть вычислимые поля? В запросе Вы отбираете все поля, а вот что потом добавляете в файл - только Вам известно. Как вариант, попробуйте отбирать только одно поле и, соответственно, только его сохранять в файл - если скорость существенно возрастет, то значит проблема в каком-то поле.
3. Возможно также, что база сильно фрагментирована - это можно узнать, запустив проверку целостности данной базы.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / скорость выгрузки в CSV
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]