Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
23.04.2012, 17:48
|
|||
---|---|---|---|
|
|||
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
Подскажите пожалуйста нужно выгрузить в Excel данные из Oracle 90000 строк 40 столбцов (процедура Ref Cursor) Что я не делал вылетает ошибка недостаточно памяти (вся память и в праду съедается). Код ниже Ошибка появилась после добавления еще одного поля SubStr(ххх,1,255) пробовал и SubStr(ххх,1,25) (в VBA я не специалист) Public Function GetR(rs As Object, n As Long) As Variant Dim a As Variant Dim c() As Variant Dim i, l, k As Long l = rs.Fields.Count a = rs.GetRows(n) ' выгрузив 80000 и съев всю память здесь падает ReDim c(n - 1, l - 1) For i = 0 To n - 1 For k = 0 To l - 1 c(i, k) = a(k, i) Next k Next i Erase a Set a = Nothing GetR = c Erase c 'Set c = Nothing End Function 'функция выгрузки Public Sub ADORun(ByVal FuncOrProcNameWithParams As String, _ ByVal FuncOrProcType As Byte, _ Optional FirstRow As Long = 0, _ Optional FirstCol As Long = 0, _ Optional LastCol As Long = 0) Dim FuncOrProcCall As String Dim CurLastRow As Long Dim a As Variant Dim n As Long Dim j As Long Select Case FuncOrProcType Case adProc, adProcRetCur FuncOrProcCall = "{call " + FuncOrProcNameWithParams + "}" Case adFunc FuncOrProcCall = "{? = call " + FuncOrProcNameWithParams + "}" End Select Command.CommandText = FuncOrProcCall Command.Prepared = True Select Case FuncOrProcType Case adProc Set ADOExec = Command.Execute() Case adProcRetCur Set RecordSet = Command.Execute() 'у меня такая команда Call ClearRange(FirstRow, FirstCol, LastCol) 'изначально пробовал так 'With ThisWorkbook.ActiveSheet.QueryTables.Add( _ ' Connection:=RecordSet, _ ' Destination:=Cells(FirstRow, FirstCol)) ' .Name = "Data List" ' .FieldNames = False ' .PreserveFormatting = True ' .RefreshStyle = xlOverwriteCells ' .AdjustColumnWidth = False ' .Refresh BackgroundQuery:=True 'End With 'Cells(FirstRow, FirstCol).CopyFromRecordset RecordSet ' потом так ' последний вариант грузить по 10000 строк If Not RecordSet.EOF Then 'RecordSet.MoveLast RecordSet.MoveFirst End If n = RecordSet.Fields("RowCnt") If n <= 10000 Then a = GetR(RecordSet, n) 'RecordSet.RecordCount) Range(Cells(FirstRow, FirstCol), Cells(UBound(a, 1) + FirstRow, UBound(a, 2) + FirstCol)) = a Else For j = 1 To n \ 10000 a = GetR(RecordSet, 10000) Range(Cells((j - 1) * 10000 + FirstRow, FirstCol), Cells((j - 1) * 10000 + UBound(a, 1) + FirstRow, UBound(a, 2) + FirstCol)) = a Next j a = GetR(RecordSet, n Mod 10000) Range(Cells(n - (n Mod 10000) + FirstRow, FirstCol), Cells(n + FirstRow, UBound(a, 2) + FirstCol)) = a End If ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.04.2012, 17:51
|
|||
---|---|---|---|
|
|||
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
фывапывапывап, пользуйтесь тегами Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.04.2012, 18:02
|
|||
---|---|---|---|
|
|||
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
фывапывапывап, транспонировать обязательно ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.04.2012, 18:05
|
|||
---|---|---|---|
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
фывапывапывап, а зачем Вам перегонять рекордсет в массив, затем транспонировать и затем дальше с ним работать. Может проще просто перегонять в массив перебором из рекордсета Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.04.2012, 18:07
|
|||
---|---|---|---|
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
Там не транспонирование, там просто a и c так созданы... фывапывапывап, а что, и .CopyFromRecordset падал с ошибкой? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.04.2012, 18:12
|
|||
---|---|---|---|
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
или как вариант выгрузить все на лист и считать в массив, хотя при таких объемах copyfromrecordset, будет медленно выгружать ... |
|||
:
Нравится:
Не нравится:
|
|||
|
23.04.2012, 19:07
|
|||
---|---|---|---|
|
|||
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
> Автор: фыкпыфвап > Подскажите пожалуйста нужно выгрузить в Excel данные из Oracle 90000 строк 40 столбцов (процедура Ref Cursor) > Что я не делал вылетает ошибка недостаточно памяти (вся память и в праду съедается). Код ниже Добавь памяти, отличное обоснование для руководства для апгрейда компьютера. P.S. Попробуй убрать массив a и присваивай Range напрямую результат GetR и поиграйся настройками Connection. Выставь CursorLocation в adUseServer и Mode в adModeRead и CursorType в adOpenForwardOnly P.S.S. В самой функции GetR убери массив с и работай напрямую с именем функции Пока писал тему прикрыли. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.05.2015, 09:44
|
|||
---|---|---|---|
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
Делаю вывод данных порционно, но все равно возникает ошибка - Недостаточно памяти. Что можно оптимизировать ? Вот код: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.05.2015, 11:19
|
|||
---|---|---|---|
|
|||
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
Бесконечный цикл. Нет условия выхода. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
16.05.2015, 02:38
|
|||
---|---|---|---|
|
|||
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
Несколько листов по миллиону строк в каждом? Неудивительно, что не хватает памяти. Зачем это все в Excel тащить? Можно же делать запросы к БД, отбирая нужную часть данных. Или Вы хотите спионерить базу, чтобы потом развернуть ее в другом месте? Попробуйте после заполнения листа сохранять и закрывать книгу, и открывать новую. Таким образом, если хватает памяти на создание одного листа, то хватит на сколько угодно. А потом, после закрытия монструозного рекордсета, можно попробовать перенести листы из нескольких книг в одну. Или оставить набор книг по одному листу. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
17.05.2015, 07:56
|
|||
---|---|---|---|
Excel при загрузке данных ADODB недостаточно памяти |
|||
#18+
Казанский , спасибо за подсказку ! Каждую порцию сохраняю в отдельном файле. Сделал так: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=61&tablet=1&tid=2173495]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 140ms |
0 / 0 |