powered by simpleCommunicator - 2.0.39     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel и память
11 сообщений из 11, страница 1 из 1
Excel и память
    #39324321
Teodorix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Столкнулся с такой проблемой.

При открытие приложения Excel оно занимает 11,8 МБ памяти по диспетчеру.

Далее я запускаю макрос, который:
1) в папке по умолчанию поочередно открывает все .xml-файлы
2) копирует выборочно 12 столбцов данных на лист книги, из которой запущен макрос, с небольшими косметическими изменениями.
3) полученный диапазон записывает (добавляя) в .csv-файл

после 50 шага Excel занимает 1 280 МБ, и работает до тех пор пока не "отъест" все ресурсы. После чего падает.

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

Ниже привел усеченный код без копирования. Для меня главное, что он работающий за одним исключением.


С уважением, Федор.


Код: vbnet
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.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
Sub XML_BASE_LOADING()
   On Error Resume Next
 
  Dim cBook As Workbook
  Dim csheet As Worksheet
  Dim STSHEET As Worksheet
  Dim CLCSHEET As Worksheet
  
  
  Dim PWay, coll As Collection
  Dim I_COUNTER As Integer
  Dim J_COUNTER As Integer
  Dim FNAME As String
  Dim FLAG As Boolean
  Dim DB As Workbook
  Dim WS As Worksheet
  Dim k As Integer
  Dim logstr As String
  
  
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  

Set cBook = ThisWorkbook
Set STSHEET = cBook.Worksheets(STOP_sheet)
Set CLCSHEET = cBook.Worksheets(CALC_SHEET)

 Application.DisplayAlerts = False
J_COUNTER = 1

'---------------------------------------------------------------------------------------------------
' Так как  приложение запускает несколько раз, то на листе STSHEET хранятся имена 
' уже обработанных файлов, дабы избежать задвоений при работе
 
    For Each FILE In coll
          FNAME = Mid(FILE, InStrRev(FILE, "\") + 1)
          I_COUNTER = 2
          FLAG = True
 
         
        Do While Len(STSHEET.Cells(I_COUNTER, 1)) <> 0
                If STSHEET.Cells(I_COUNTER, 1).Value = FNAME Then
                    FLAG = False
                End If
                I_COUNTER = I_COUNTER + 1
        Loop

' Если файл еще не был обработан и мы обработали меньше    Limit_max (после которых Эксель вешает машину), то 
' открываем его для работы

        If FLAG And J_COUNTER <= Limit_max Then
                STSHEET.Cells(I_COUNTER, 1) = FNAME
                CLCSHEET.Range("A1:Z65000").Clear
                Set DB = Workbooks.Open(FILE)

 ' проверяем наличие в *xml-файле нужного нам листа            
  
                For Each WS In DB.Sheets
                        If WS.Cells(1, 1) = "/Данные" Then
                            I_COUNTER = 1

                            Do While Len(WS.Cells(2, I_COUNTER)) <> 0
                           
                                 ' В случае успеха копируем столбцы - для удобства убрал  
                                
                                I_COUNTER = I_COUNTER + 1
                                 
                            Loop
                            cBook.Activate
                            I_COUNTER = 3
                           ' нахожу кол-во строк, необходимых к копрованию
                            Do While Len(CLCSHEET.Cells(I_COUNTER, 7)) <> 0
                                I_COUNTER = I_COUNTER + 1
                            Loop

                            Open target_file For Append As #1
                            
                            For k = 3 To I_COUNTER - 1
                                logstr = CLCSHEET.Cells(k, 1)                                                                 
                                Print #1, logstr
                            Next
                            Close #1
                            
                            
                        End If
                
                Next
                J_COUNTER = J_COUNTER + 1
                DB.Close
                Set DB = Nothing
                
                
        End If
          
    Next
   Application.DisplayAlerts = True
   
 
End Sub
...
Рейтинг: 0 / 0
Excel и память
    #39324451
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Teodorix, попробуйте закрывать с явным указанием "без сохранения"
Код: vbnet
1.
DB.Close 0


И попробуйте вместо очистки листа CLCSHEET.Range("A1:Z65000").Clear удалять его целиком и создавать заново. А может, лучше даже создавать новую книгу при обработке каждого файла и закрывать ее без сохранения.
...
Рейтинг: 0 / 0
Excel и память
    #39324512
Teodorix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский,

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

Я полагал, что команда
Код: vbnet
1.
Set DB = Workbooks.Open(FILE)



Создает новую книгу. Или вы подразумевали новый экземпляр?
...
Рейтинг: 0 / 0
Excel и память
    #39324522
Фотография The_Prist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TeodorixСоздает новую книгуДаже сам метод называется Open - открыть. Нет, он открывает указанную книгу. Создание новой книги происходить через метод .Add
...
Рейтинг: 0 / 0
Excel и память
    #39324566
Teodorix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Казанский, спасибо за дельные советы

The_Prist, спасибо за дельный пинок.


Благодаря "И попробуйте вместо очистки листа CLCSHEET.Range("A1:Z65000").Clear удалять его целиком и создавать заново. А может, лучше даже создавать новую книгу при обработке каждого файла и закрывать ее без сохранения." скорость "жора" уменьшилась на 15%, однако тенденция не меняется.

Видимо решение придется искать в плоскости второго экземпляра приложения.
...
Рейтинг: 0 / 0
Excel и память
    #39324574
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Teodorix,

Я вот не понял, приведенный пример (без копирования) тоже жрет память?
...
Рейтинг: 0 / 0
Excel и память
    #39324577
Teodorix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Да, открытие xml-файла отжирает 20 МБ, которые и накапливаются.
...
Рейтинг: 0 / 0
Excel и память
    #39324591
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TeodorixДа, открытие xml-файла отжирает 20 МБ, которые и накапливаются.Если убрать остальную шелуху, запись в файл и т.п., оставить чистое открытие и закрытие - тоже накапливается?

Если да - происходит это на ваших специфических файлах или на любых, включая пустые. Происходит утечка, если открывать-закрывать один и тот же файл?

ЗЫ: cBook.Activate там зачем?
...
Рейтинг: 0 / 0
Excel и память
    #39324618
Teodorix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Оставил только открытие и закрытие.

Код: vbnet
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.
  For Each FILE In coll
           
          FNAME = Mid(FILE, InStrRev(FILE, "\") + 1)
          I_COUNTER = 2
          FLAG = True
          
        Do While Len(STSHEET.Cells(I_COUNTER, 1)) <> 0
                If STSHEET.Cells(I_COUNTER, 1).Value = FNAME Then
                    FLAG = False
                End If
                I_COUNTER = I_COUNTER + 1
        Loop
        
        If FLAG And J_COUNTER <= Limit_max Then
                STSHEET.Cells(I_COUNTER, 1) = FNAME
                
                Set newBook = Workbooks.Add
                
                Set CLCSHEET = newBook.Worksheets.Add
                CLCSHEET.Name = CALC_SHEET
                            
                Set DB = Workbooks.Open(FILE)
                
             

                J_COUNTER = J_COUNTER + 1
                DB.Close 0
                newBook.Close 0
                Set newBook = Nothing
                Set CLCSHEET = Nothing
                Set DB = Nothing
                Set WS = Nothing
                logstr = ""
                FNAME = ""
                              
                
        End If
          
    Next
   Application.DisplayAlerts = True
   
   
End Sub



Продолжает утекать по 20 МБ / 5МБ файл. Опробовал на XLS,TXT, XLSM, XLSX файлах - почти не утекает. Прирост 2МБ на 50 файлов по 10 МБ.
...
Рейтинг: 0 / 0
Excel и память
    #39325950
Teodorix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Всем спасибо за предложенные варианты.
Решил проблему запуском второго экземпляра Excel'я и переносом в него всей обработки информации.
...
Рейтинг: 0 / 0
Excel и память
    #39326224
Фотография essbase.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можешь раскрыть тему
- как запускашь - как обмениваешься результатами

Или Excel у тебя тут выступает как ETL тулза ?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Excel и память
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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