Текущее время: Ср, июл 23 2025, 01:35

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Перераспределение памяти под таблицу
СообщениеДобавлено: Ср, мар 21 2007, 14:43 
Специалист
Специалист

Зарегистрирован:
Ср, мар 21 2007, 14:32
Сообщения: 158
Доброе господа!
я так понимаю что конструкция типа
data: tbl like ... initial 0.
do 100 times.
append ... to tbl.
enddo.
будет работать медленнее чем такая
data: tbl like ... initial 200.
do 100 times.
append ... to tbl.
enddo.
первая ведь должна перед каждым добавлением память перераспределять.
а если нужно сделать 200000 раз append, то для первого варианта наверное время вообще затянется.

можно ли как нибудь сделать такое.
data: tbl like ... initial 200.
do 1000 times.
if sy-index >= 200.
тут нужно расширить количество памяти под таблицу еще на 200 записей
может есть какой нить reinitial size?
endif.
append ... to tbl.
enddo.
наверно одна операция изменения памяти под таблицу до N записей будет отрабатываться быстрее, чем система сама будет каждый раз выделять память для каждого append.

И еще.
Если я объявил таблицу так.
data: xml_table type table of string.
потом добавляю туда 10000 записей append-ами.
затем сохраняю таблицу в локальный файл.
затем делаю ей refresh и опять заполняю ее и добавляю к ранее сохраненному файлу.
и так раз 20.
это работает очень долго.

как это можно ускорить???
пробовал добавлять initial 10000. не помогло.
может кроме того что добавил initial вместо refresh нужно что нибудь другое использовать?
free там или clear?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 21 2007, 15:00 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Если не ошибаюсь, initial size это только начальный размер.
Дальше под таблицу выделяется память, пропорциональная текущему размеру.

Можно попробовать вообще обойтись без внутренней таблицы, а писать сразу в файл. Попробуйте вместо внутренней таблицы использовать экстракты: хоть и устаревшая технология, но может работаь быстрее с большими объёмами информации.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Extract
СообщениеДобавлено: Ср, мар 21 2007, 15:28 
Специалист
Специалист

Зарегистрирован:
Ср, мар 21 2007, 14:32
Сообщения: 158
В хелпе написано что extract выгружает в dataset
а он может быть локальным?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, мар 21 2007, 15:42 
Специалист
Специалист

Зарегистрирован:
Вс, мар 13 2005, 13:59
Сообщения: 201
Откуда: Moscau
Цитата:
Since you can create memory objects in your programs,
you must also be able to delete them. For table
references or string references, use the ABAP statements
CLEAR, FREE, and REFRESH.1 Applying
these statements to a reference variable pointing to a
string or table body that is also referenced by other
reference variables (in other words, to a memory
object that is shared by multiple references) leaves the
memory object alive, decrements its reference count
by one, and sets the reference variable to the typespecific
initial value. Memory will only be freed once
the table body or string is no longer shared by other
references (or, in other words, once the reference
count is one) when the delete operation occurs. A
memory leak simply cannot occur as long as you
remember to clear all internal tables or string references
once they are no longer used.
...
Low used-to-allocated memory ratio: You can
create ABAP internal tables with an arbitrary size
by using the INITIAL SIZE parameter. Using this
parameter carelessly can lead to wasted memory
if the application can’t ever fill the allocated size.
Also remember that the ABAP runtime environment
automatically increases the allocated memory
for an internal table as needed when rows are
added, but never decreases the allocated memory,
even if all the rows have been deleted. For this
reason, internal tables in the root set that are only
used during the early stages of an application are a
potential source of wasted memory. The system
can’t reuse the allocated storage until the table
bodies are deleted.



Попробуй делать не refresh, a delete.

А вообще запусти свою программу в se30 и посмотри на чем точно тормозит. что-то у меня подозрение что проблема не в выделении памяти (hint в варианте измерений поставь что агрегации нет).
PS цитата из статьи Save Time and Effort with ABAP Memory Inspector http://rapidshara.ru/1442669


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перераспределение памяти под таблицу
СообщениеДобавлено: Чт, мар 22 2007, 00:07 
Президент
Президент

Зарегистрирован:
Пт, апр 28 2006, 22:39
Сообщения: 2514
Откуда: North Taxolina, USA
Пол: Женский
_gary_ написал(а):
как это можно ускорить???


А в чем, извиняюсь, конечная цель всех этих телодвижений?
:?
Судя по Help, если вы точно не уверены насчет размера таблицы, то лучше оставить 0 и не париться:

Цитата:
Internal tables are a dynamic data structure. Their memory requirements are met in blocks. The initial memory allocation (hereafter called the OCCURS area), can be controlled using the " OCCURS n" or "INITIAL SIZE n " addition in the table definition (see DATA, TYPES). Once the OCCURS area is full, the next block to be created is twice as big as the OCCURS area (as long as this is not greater than 8 KB). All further blocks are then created with a constant size of 12 KB.

You can leave it to the system to determine the size of the OCCURS area by specifying n = 0. In this case, the system allocates only a "small" portion of memory at the first INSERT or APPEND statement. "OCCURS 0" or "INITIAL SIZE 0" means that 16 <= n <= 100 (depending on the line width).

It only makes sense to specify a concrete value of n > 0 when you know exactly how many entries the table will have, and you want to set up the OCCURS area exactly. This can be particularly important if you want to nest internal tables (where an "outer" internal table contains one or more other internal tables in each line, and the "inner" tables only have a few entries (no more than 5, for example).

To avoid excessive memory requirements, the system handles large values of n as follows: The largest possible value of n is n_max = 8 KB divided by the line width. For larger values, n is set such that n multiplied by the line width is around 12 KB.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Мне нужно увеличить скорость заполнения таблицы
СообщениеДобавлено: Чт, мар 22 2007, 09:25 
Специалист
Специалист

Зарегистрирован:
Ср, мар 21 2007, 14:32
Сообщения: 158
вот собственно


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 22 2007, 09:35 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, июн 16 2005, 10:29
Сообщения: 336
Откуда: Минск->Москва
Пол: Мужской
Мне кажется на скорость влияет формирование данных для таблицы и само сохранение в файл, а не конкретно размер внутренней таблицы. Может имеет смысл попробовать сократить количество итераций работы с файлом... Если привели бы ваш код, то можно было бы говорить конкретнее.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 22 2007, 12:02 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
если Вы знаете размер записи, попробуйте отказаться от string, указав явно
data: xml_table type table of xxx. "где xxx - bsik например.

free делать не стоит, если Вы собираетесь повторно заполнять выделенный блок памяти новыми данными. нужен именно refresh

И потом, очень долго, это сколько в секундах и какое количество записей сохраняете в файл? Приведите точные цифры.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 22 2007, 13:44 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, мар 05 2007, 15:30
Сообщения: 261
Откуда: Москва
Для таблицы с типом строки string резервирование памяти occurs 10... и другими аналогичными механизмами не имеет смысла, поскольку объем резервируется только под строки нулевой длины (физическим размером равным хедеру строки). А дальше, если строки не пустые, получается только хуже.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, мар 22 2007, 13:57 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, мар 05 2007, 15:30
Сообщения: 261
Откуда: Москва
_gary_, я так понимаю что Вы выгружаете данные на локальный хост, технология выглядит следующим образом: данные с сервера приложений передаются на фронтенд, фронтенд передает эти данные компоненту ActiveX, который уже выгружает эти данные на жесткий диск локальной машины. Ускорить этот процес программым путем мало реально, даже если Вы будете выгружать данные на сервер приложений, а потом тащить оттуда средствами САП скорости это не прибавит, поскольку бутылочное горлышко сам процесс передачи данных с сервера презентаций на жесткий диск локального хоста. Естественно обращение к жесткому диску локальной машины из САПа тотже процесс, но в обратную сторону. Таким образом если Вы будете гонять данные туда сюда, скорости это не прибавит, поэтому постарайтесь сформировать данные в САПе и выгружать их за один присест, ну или формируйте файл на сервере приложений и потом тащите его уже оттуда.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, мар 23 2007, 10:54 
Специалист
Специалист

Зарегистрирован:
Ср, мар 21 2007, 14:32
Сообщения: 158
Размер таблицы около 250 000 записей. при ее формировании на некоторыъ клиентах программа вываливается в дамп. поэтому формирую ее покусочно и с помощью GUI_DOWNLOAD добавляю ее в локальный файл.

Идея сформировать файл на сервере и потом перетянуть его на локалку мне тоже приходила. но не знаю насколько она даст выйгрышь при кусочном добавлении в файл.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB