Excel после каждого SELECT-а растет размер в памяти

Программирование на Visual Basic for Applications
Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Excel после каждого SELECT-а растет размер в памяти

Сообщение Avtopic » 06.01.2007 (Сб) 16:59

Здравствуйте все!

Читаю данные из книги, с помощью запроса.
Код: Выделить всё
SELECT * FROM [Main$A7:B5000] IN '" & ... & "'[Excel 8.0;HDR=NO;IMEX=1]
Только читаю, а размер в памяти, занимаемая Excel-ем растет, после каждого чтения на 2-5M.
Кончается все тем, что не хватает ресурсов.
Читал вот это, но мне кажется это про Update и про размер на диске:
http://support.microsoft.com/default.aspx?scid=kb;en-us;293828

В маем же случае растет размер в памяти, и при чтении данных.
Если сохранить файл, то размер на диске прежний.
Вроде ничего не оставляю откритим, проверял
и Recordsets.Count и Databases.Count.
Явно баг какой-то.

Кто не будь имеет такой опит?
Спасибо заранее.

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 09.01.2007 (Вт) 18:17

А если после очередной читки память чистить?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.01.2007 (Вт) 18:29

Предложишь способ сделать это, bi-lya?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 10.01.2007 (Ср) 3:19

Посмотрите это. Как-будто требуемое

Idle Method Example

This example uses the Idle method to ensure that an output procedure is accessing the most current data available from the database. The IdleOutput procedure is required for this procedure to run.

Код: Выделить всё
Sub IdleX()

    Dim dbsNorthwind As Database
    Dim strCountry As String
    Dim strSQL As String
    Dim rstOrders As Recordset

    Set dbsNorthwind = OpenDatabase("Northwind.mdb")

    ' Get name of country from user and build SQL statement
    ' with it.
    strCountry = Trim(InputBox("Enter country:"))
    strSQL = "SELECT * FROM Orders WHERE ShipCountry = '" & _
        strCountry & "' ORDER BY OrderID"

    ' Open Recordset object with SQL statement.
    Set rstOrders = dbsNorthwind.OpenRecordset(strSQL)

    ' Display contents of Recordset object.
    IdleOutput rstOrders, strCountry

    rstOrders.Close
    dbsNorthwind.Close

End Sub

Sub IdleOutput(rstTemp As Recordset, strTemp As String)

    ' Call the Idle method to release unneeded locks, force
    ' pending writes, and refresh the memory with the current
    ' data in the .mdb file.
    DBEngine.Idle dbRefreshCache

    ' Enumerate the Recordset object.
    With rstTemp
        Debug.Print "Orders from " & strTemp & ":"
        Debug.Print , "OrderID", "CustomerID", "OrderDate"
        Do While Not .EOF
            Debug.Print , !OrderID, !CustomerID, !OrderDate
            .MoveNext
        Loop
    End With

End Sub


Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 10.01.2007 (Ср) 16:24

Насколько я понял, соль всего этого кода DBEngine.Idle dbRefreshCache
А Idle только снимает блокировки и принудительно обновляет память последними данными выборки.
И как результат, ничего не изменил в объеме памяти.

bi-lya
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 07.08.2006 (Пн) 15:36

Сообщение bi-lya » 22.01.2007 (Пн) 8:43

Avtopic, если проблема еще актуальна - а не пробовали явно помечать на удаление для "уборщика"
Код: Выделить всё
object=Nothing
?


Вернуться в VBA

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

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

    TopList