Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Экспорт в Excel и память  [new]
conrad
Member

Откуда:
Сообщений: 35
PB 6.5.1 Есть скрипт, который конвертирует некоторое количество html - файлов в Excel. Выглядит примерно так

lole_excel = create oleobject
lole workbook = create oleobject
IF lole_excel.ConnectToNewObject("excel.application") <> 0 THEN
destroy lole_excel
RETURN -1
END IF
Здесь начинается цикл, в котором перебираются названия файлов

lole_workbook = lole_excel.application.workbooks.open(ls_path + '.htm')
lole_workbook.SaveAs(ls_path+'.xls',-4143)
lole_workbook.close()

Здесь цикл заканчивается

lole_excel.application.quit
lole_excel.DisconnectObject()

destroy lole_workbook
destroy lole_excel

Работать-то это работает, но с каждым новым файлом отъедает кусок памяти, и в конце концов приложение вылетает с сообщением Out of memory. Как решить проблему?
9 июн 04, 12:43    [731350]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
Ikar
Member

Откуда: Москва
Сообщений: 928
2 conrad:
Сталкивались с подобной проблемой, только с вордом, а не с экселем.
По опыту могу прекомендовать следующее (примерно применительно к вашей стиуации):
1. оле-объект создаем в цикле для каждого нового файла.
2. выполняем необходимые операции.
3. уничтожаем объект.
4. принудительно вызываем GarbageCollect ( )
5. переходим к следующей операции цикла.

Замечу, что это все только мои рекомендации...
---
С уважением, IKAR
ikarhomecenter@narod.ru
IkarHomeCenter
9 июн 04, 12:57    [731427]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
conrad
Member

Откуда:
Сообщений: 35
Пробовал и такой вариант. Память частично очищается, но все равно постепенно утекает, так что при большом количестве файлов это проблему не решает.
9 июн 04, 13:04    [731468]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
dGrichine
Member

Откуда: Москва
Сообщений: 135
попробуй так
не используй второй oleobject
у меня утечки памяти нет
PB 6.5.1

oleobject lole_excel
string ls_path = "c:\temp\employee_out"
integer i

lole_excel = create oleobject
//lole workbook = create oleobject
IF lole_excel.ConnectToNewObject("excel.application") <> 0 THEN
	destroy lole_excel
	RETURN
END IF 

for i = 1 to 100
	lole_excel.application.workbooks.open(ls_path + '.htm').SaveAs(ls_path + string(i) + '.xls',-4143)
next

lole_excel.application.quit
lole_excel.DisconnectObject()

destroy lole_excel

===
Гришин Дмитрий
9 июн 04, 13:11    [731496]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
dGrichine
Member

Откуда: Москва
Сообщений: 135
извини поторопился без второго ole не обойтись
у меня вот с таким скриптом и памятью все в порядке, excel отжирает 4-5 мегабайт при старте и больше память не растет...

до старта скрпипта 151 Мб занят при работе 155-156
по завершении опять 151...

PB 6.5.1 Win2k Prof SP4 RUS

oleobject lole_excel, lole_workbook
string ls_path = "c:\temp\employee_out"
integer i

lole_excel = create oleobject
//lole_workbook = create oleobject
IF lole_excel.ConnectToNewObject("excel.application") <> 0 THEN
	destroy lole_excel
	RETURN
END IF 

//lole_excel.Visible = True

for i = 1 to 100
	lole_workbook = lole_excel.application.workbooks.open(ls_path + '.htm')
	lole_workbook.SaveAs(ls_path + string(i) + '.xls',-4143)
	lole_workbook.Close()
next

lole_excel.application.quit
lole_excel.DisconnectObject()

destroy lole_workbook
destroy lole_excel

MessageBox('','Ok')

===
Гришин Дмитрий
9 июн 04, 13:41    [731632]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
conrad
Member

Откуда:
Сообщений: 35
Дмитрий, на самом деле без вторго oleobject вполне можно обойтись, примерно так
lole_excel.application.workbooks(ls_fileName+'.htm').SaveAs(ls_path+'.xls',-4143)
только это мало меняет картину.
Дело в том, что если просто конвертировать файл, проблем с памятью нет. Но в моем случае в excel еще задается оформление для диапозонов ячеек - шрифты, цвета и формулы. Чем больше таких извращений, тем больше утечка. По итогам экспериментов, самым экономичным вариантом остается тот, о котором писал Икар. Спасибо всем, кто откликнулся, если есть еще какие-то соображения, пожалуйста, поделитесь.
9 июн 04, 14:08    [731765]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
Anatoly Moskovsky
Member

Откуда: Odessa
Сообщений: 6610
А с другой версией Excel что-то меняется? Или не зависит от этого?
9 июн 04, 14:18    [731806]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
dGrichine
Member

Откуда: Москва
Сообщений: 135
автор
на самом деле без вторго oleobject вполне можно обойтись

без него не обойтись, так как надо закрывать открытую книгу

попробуй поставить
lole_excel.Visible = True
и ты увидишь что в этом случае открытые книги не закрываются и следовательно excel отжирает память под новые файлы... и это не может проболжаться до бесконечности

автор
Но в моем случае в excel еще задается оформление для диапозонов ячеек - шрифты, цвета и формулы. Чем больше таких извращений, тем больше утечка

вот с этим трудно согласиться... сомневаюсь, чтобы excel при манипулировании свойствами ячеек отжирал память...
где-то что-то у тебя остается в памяти

чтобы в этом разобраться посмотри что за приложение отжирает память - PB или Excel... (например с помощью Process Explorer http://www.sysinternals.com/) после этого можно уже искать причину...

если Excel - то смотри закрывает ли он файлы
если Билдер - то смотри код. подключай функционал по мере нарастания сложности манипуляций - найдешь на чем происходит рост памяти...

а постоянно поднимать новый экземпляр Excel.application и тут же его закрывать - это крайняя мера... хотя бы по 50-100 файлов, но не постоянно...

===
Гришин Дмитрий
9 июн 04, 14:36    [731916]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
conrad
Member

Откуда:
Сообщений: 35
lole_excel.application.workbooks(ls_fileName+'.xls').close()
Это насчет одного oleobject. Прошу прощения, насчет оформления я погорячился, сильно картину оно не меняет. Память жрет не excel, а приложение на PB, версия Excel значения не имеет. А в том варианте, на котором я остановился excel.application один, уничтожается lole_workbook, а потом garbageCollect(). При таком раскладе все несколько лучше, чем с одним oleobject.
9 июн 04, 14:55    [732024]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
dGrichine
Member

Откуда: Москва
Сообщений: 135
автор
Память жрет не excel, а приложение на PB, версия Excel значения не имеет. А в том варианте, на котором я остановился excel.application один, уничтожается lole_workbook, а потом garbageCollect(). При таком раскладе все несколько лучше, чем с одним oleobject.


если ты уверен, что память жрет PB, то тебе и карты в руки...
ты же говоришь, что если форматирование не использовать, то все ОК... подключай постепенно функционал с форматированием ячеек и увидишь на каком месте у тебя в билдере что-то остается в памяти...
наверняка ты используешь еще ole объекты для доступа к ячейкам или диапазонам Excel...

PS
Думаю, руки опускать рано... надо искать причину

Кстати, ты не используешь в этом коде Describe("Evaluate(...)")?

===
Гришин Дмитрий
9 июн 04, 15:09    [732111]     Ответить | Цитировать Сообщить модератору
 Re: Экспорт в Excel и память  [new]
ChV
Member

Откуда: Москва
Сообщений: 271
Ситуация была и у меня - почти один в один. Что только не перепробовал (PB 7.03 ). Обработка больших массивов информации с сохранением результатов обработки в EXCEL файле. "Out of memory" - замучил. Выяснил, что проблема была не с EXCEL, а в предке объекта PB - "u_progressbar". В предлагаемом скрипте его нет, но я когда искал причины проблемы его тоже не рассматривал.
9 июн 04, 15:46    [732314]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить