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

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

При открытие приложения 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
11.10.2016, 13:27
    #39324451
Казанский
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel и память
Teodorix, попробуйте закрывать с явным указанием "без сохранения"
Код: vbnet
1.
DB.Close 0


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

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

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



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

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


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

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

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

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

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

ЗЫ: cBook.Activate там зачем?
...
Рейтинг: 0 / 0
11.10.2016, 15:24
    #39324618
Teodorix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel и память
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
13.10.2016, 10:02
    #39325950
Teodorix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel и память
Доброго времени суток.

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

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


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