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

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

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

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

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

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

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

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

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
30.08.2011, 12:01
    #37417321
Turk
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скорость выгрузки в CSV
michaeldevp,
Для поиска "узких" мест в коде можно воспользоваться утилитой MONLBL .
...
Рейтинг: 0 / 0
30.08.2011, 13:55
    #37417541
doublefint
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скорость выгрузки в CSV
michaeldevp Set result=##class(%ResultSet).%New("%DynamicQuery:SQL")
s sqlstr="SELECT * FROM "_ClsName

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

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

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

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

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

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

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

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

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

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

Код: 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
30.08.2011, 17:43
    #37418071
michaeldevp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
скорость выгрузки в CSV
krvsa,

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


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