Страницы: 1
RSS
максимальный размер массива
 
Добрый день!  
Создаю трехмерный массив mymas(1 To 50, 1 To 5000, 1 To 50), все ок, но мне не хватает 5000 строк, нужно 50000. Рисую mymas(1 To 50, 1 To 50000, 1 To 50), получаю Out of memory.  
Как переполнения памяти избежать и массив большой поиметь?
 
Может пямяти добавить?  
У меня Dim mymas(1 To 50, 1 To 50000, 1 To 13) ещё работает, 14 уже не тянет.  
Да и 13 небыстро создаёт...
 
{quote}{login=Hugo}{date=25.08.2011 03:57}{thema=}{post}Может пямяти добавить?  
У меня Dim mymas(1 To 50, 1 To 50000, 1 To 13) ещё работает, 14 уже не тянет.  
Да и 13 небыстро создаёт...{/post}{/quote}  
А можно как-то проверку сделать на достаточность памяти, если до создаем такой массив, если нет, то делаем его меньше, к примеру.  
А у меня памяти на борту 1Гиг и столько же файл подкачки.
 
roka, а что Вы собираетесь запихивать в такой массив (если не секрет) ?
 
{quote}{login=Люботытный}{date=25.08.2011 05:06}{thema=}{post}roka, а что Вы собираетесь запихивать в такой массив (если не секрет) ?{/post}{/quote}  
несколько таблиц с разных листов, размер таблиц - 50 столбцов и строк от 1000 до 10000
 
Не понимаю - зачем в один?  
Делайте параллельные массивы сразу из диапазонов листов - будет типа "массив массивов"  
Или сперва создать массив по количеству листов, а в него поместить массивы данных листов.  
Не пробовал правда - сейчас попробую :)
 
Попробовал.  
Для теста вставил третьим листом лист диаграмм :)  
Работает корректно - выводит данные третьего воркшита.  
 
Option Explicit  
 
Sub tt()  
Dim i&  
ReDim a(1 To Worksheets.Count)  
For i = 1 To UBound(a)  
a(i) = Worksheets(i).UsedRange.Value  
Next  
MsgBox a(3)(1, 1)  
End Sub
 
{quote}{login=Hugo}{date=26.08.2011 09:33}{thema=}{post}Не понимаю - зачем в один?  
Делайте параллельные массивы сразу из диапазонов листов - будет типа "массив массивов"  
Или сперва создать массив по количеству листов, а в него поместить массивы данных листов.  
Не пробовал правда - сейчас попробую :){/post}{/quote}  
я так не умею, начальные знания, пишу макросы только для упрощения своей трудовой жизни и коллег :(
 
проверку просто сделать.. на калькуляторе..  
 
каждый элемент массива 16 байт - 50*5000*50*16=190Мб  
 
соответственно если хотите 50 000, то будет 1,86Гб.. да еще и самому икселю сколько-то нужно.. и виндосу..
Живи и дай жить..
 
Получается, что в файл подкачки данные не скидываются - и если загружать например в массив моим кодом выше большой файл, то может не отработать?  
Но хоть так "лишнего массива" создавать не будем...
 
ps это если у вас там числа, если строки, то еще больше  
 
 
если у вас в массивах числа, то можно уменьшить объем требуемой памяти, объявив соответствующий тип данных:  
целые числа - 1-4 байта  
вещественные - 4-8 байт
Живи и дай жить..
 
>>roka, а что Вы собираетесь запихивать в такой массив (если не секрет)?  
 
>несколько таблиц с разных листов, размер таблиц - 50 столбцов и строк от 1000 до 10000  
 
Зачем пихать в массив?
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
В общем-то да, зачем сразу всё пихать?  
Если нужно циклом пройтись по всем данным - идём циклом по листам, из каждого берём в массив, просматриваем массив, изменяем-выгружаем, убиваем массив.  
Тогда в один момент времени в памяти будут только данные максимум 2-х листов.  
Чуть муторно, теряется время на загрузку/выгрузку, но зато памяти займёт меньше, и должно работать.
 
{quote}{login=nerv}{date=26.08.2011 10:59}{thema=}{post}>>roka, а что Вы собираетесь запихивать в такой массив (если не секрет)?  
 
>несколько таблиц с разных листов, размер таблиц - 50 столбцов и строк от 1000 до 10000  
 
Зачем пихать в массив?{/post}{/quote}  
В общем, бежим по таблицам собираем данные в один общий массив, потом на основе этого массива создаем общую таблицу и выкидываем все на другой лист. Как-то так.
 
>>В общем, бежим по таблицам собираем данные в один общий массив, потом на основе этого массива создаем общую таблицу и выкидываем все на другой лист. Как-то так.  
 
На это я бы мог Вам сказать ответить примерно следующее  
 
>>В общем-то да, зачем сразу всё пихать?  
>>Если нужно циклом пройтись по всем данным - идём циклом по листам, из каждого берём в массив, просматриваем массив, изменяем-выгружаем, убиваем массив.  
 
но Hugo уже ответил наперед.  
 
=17118=
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
>>сказать ответить  
 
Пятница : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Да, и если изменять и назад выгружать не нужно, то и по времени сильно не проиграете - взяли, проанализировали-отобрали, убили, взяли следующие данные.  
Чуть сложнее заранее определить, какой выходной массив нужен, но можно вероятно или сперва пробежаться по листам и подсчитать общее количество строк (возможный максимум), или создать сразу на весь лист выгрузки (больше ведь не влезет), или создавать массив на 50000 строк, по заполнению выгружать и заполнять заново, или использовать ReDim (что я не люблю...)  
Или просто результат писать сразу на лист - да, медленно, зато память экономим (надеюсь... :) )
 
{quote}{login=nerv}{date=26.08.2011 12:37}{thema=}{post}>>В общем, бежим по таблицам собираем данные в один общий массив, потом на основе этого массива создаем общую таблицу и выкидываем все на другой лист. Как-то так.  
 
На это я бы мог Вам сказать ответить примерно следующее  
 
>>В общем-то да, зачем сразу всё пихать?  
>>Если нужно циклом пройтись по всем данным - идём циклом по листам, из каждого берём в массив, просматриваем массив, изменяем-выгружаем, убиваем массив.  
 
но Hugo уже ответил наперед.  
 
=17118={/post}{/quote}  
Тут не все так просто, как кажется. Выходная таблица создана и даже может иметь данные, так вот надо прибавить эти данные к таблице, поэтому удобнее растянуть табличку сразу за один раз, зная сколько у тебя данных в массиве.
Страницы: 1
Читают тему
Наверх