Нужно из базы данных передать большой массив данных в слой бизнес логики. Далее маcсив нужно только проенумерейтить. Дата сет не подходит, т.к. елементы массива должны иметь тип
public class MyClass
{
string field1;
string[] field2;
}
Какой массив в .Net Framework расходует наименьшее количество памяти? На сколько я понимаю, нужно выбирать из ArrayList и MyType[]. Кто нибудь знает сколько расходует ArrayList из N Object и сколько Object[N] (размер Object'а для простоты опустим)?
Re: Какой массив расходует наименьшее количество памяти?
Hello, "basis"
> Какой массив в .Net Framework расходует наименьшее количество памяти? На сколько я понимаю, нужно выбирать из ArrayList и MyType[]. Кто нибудь знает сколько расходует ArrayList из N Object и сколько Object[N] (размер Object'а для простоты опустим)?
Меньше всего будет расходовать массив структур (MyType[]). Для удобства работы можно взять CodeSmith который умеет генерировать типизированные версии будет аналог (ArrayList для структуры).
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Какой массив расходует наименьшее количество памяти?
От:
Аноним
Дата:
29.12.04 09:12
Оценка:
ArrayList расходовать будет всегда больше памяти.. пусть даже на несколько байт. В действительности он внутри себя хранит массив object[Capacity] элементов. Что как правило больше его Count, если вы конечно не подогнали его потом. Если вы не планируете изменять количество элеентов в массиве то не дурите себе голову — используйте простой массив — будет меньше приведений типов.
Здравствуйте, TK, Вы писали:
TK>Меньше всего будет расходовать массив структур (MyType[]). Для удобства работы можно взять CodeSmith который умеет генерировать типизированные версии будет аналог (ArrayList для структуры).
Про массив структур и CodeSmith понял, используя структуры я сэкономлю по 4 байта на каждом элементе, правильно?. Хотел еще задать вопрос про отличия ArrayList и MyType[], но уже Virus Quartirus ответил .
Re: Какой массив расходует наименьшее количество памяти?
Здравствуйте, Virus Quartirus, Вы писали:
А>Если вы не планируете изменять количество элеентов в массиве то не дурите себе голову — используйте простой массив — будет меньше приведений типов.
В слое бизнес логики размер массива менять, конечно не будут. Но мне для того, что бы заранее знать размер массива, придется лишний раз сходить к БД. Оправдан ли будет лишний запрос БД, или лучше сгенерировать типизированный аналог ArrayList? Есть еще вариант: во время вычитывания данных класть их в ArrayList, а потом вызывать ArrayList.ToArray(typeof(MyType)). Но это как я понимаю самый нехороший вариант, ибо нельзя использовать структуры, что бы избежать boxing, unboxing, и само копирование на ToArray может сказаться на производительности.
Re: Какой массив расходует наименьшее количество памяти?
Здравствуйте, coala, Вы писали:
C>Здравствуйте, basis. C>Если не требуется доступ по индексу, то наиболее оптимальным будет связанный список, в .NET 2.0 есть класс List
LinkedList<T>
List<T> — это не связный список, это генериковый аналог ArrayList.
... << RSDN@Home 1.1.4 beta 3 rev. 264>>
Re[2]: Какой массив расходует наименьшее количество памяти?
Здравствуйте, coala, Вы писали:
C>Здравствуйте, basis. C>Если не требуется доступ по индексу, то наиболее оптимальным будет связанный список, в .NET 2.0 есть класс List
Изначально вопрос был про Framework 1.*. Но ради интереса хочется узнать, почему связанный список оптимальнее? Ведь для реализации связанного списка длинной N нужно хранить N ссылок на следующий элемент, что для реализации массива не требуется.
Re: Какой массив расходует наименьшее количество памяти?
От:
Аноним
Дата:
29.12.04 14:58
Оценка:
Не очень ясно каким образом вы получаете эти данные для заполнения массива и почему неизвестно их кличество? У ArrayList есть еще один побочный эффект: при добавлении в него элементов если их Count начинает превышать Capacity, то происходит перевыделение нового внутреннего массива только уже большего объема, так что будте осторожны, может статься что быстрее было бы лишний раз к базе обратиться..
Здравствуйте, Аноним, Вы писали:
А>Не очень ясно каким образом вы получаете эти данные для заполнения массива и почему неизвестно их кличество?
Дык OracleDataReader'ом вычитываю.
А>У ArrayList есть еще один побочный эффект: при добавлении в него элементов если их Count начинает превышать Capacity, то происходит перевыделение нового внутреннего массива только уже большего объема, так что будте осторожны, может статься что быстрее было бы лишний раз к базе обратиться..
Спасибо, учту.
Re[2]: Какой массив расходует наименьшее количество памяти?
От:
Аноним
Дата:
29.12.04 15:56
Оценка:
а у него случайно нету такого свойства как RecordsAffected?..
Здравствуйте, Virus Quartirus, Вы писали:
VQ>а у него случайно нету такого свойства как RecordsAffected?..
А оно для SELECT statements не работает. Я так понимаю это потому, что кода вызывается OracleCommand.ExecuteReader с SELECT statement, данные из БД на сторону клиента еще не попали, а поступают по мере вычитывания данных с помощью OracleDataReader.Read().
Re[2]: Какой массив расходует наименьшее количество памяти?
Здравствуйте, basis, Вы писали:
B> Есть еще вариант: во время вычитывания данных класть их в ArrayList, а потом вызывать ArrayList.ToArray(typeof(MyType)). Но это как я понимаю самый нехороший вариант, ибо нельзя использовать структуры, что бы избежать boxing, unboxing, и само копирование на ToArray может сказаться на производительности.
Да не может это сказаться на производительности ArrayList.ToArray(typeof(MyType)), если эти строки вычитываются из базы, в какие-то хеш-таблицы внутренние вбиваются (внутри CLR), бессмыслено париться о массиве указателей на строки, 0.1% сэкономим, а смысл где? Я так понял строки в структурах?
Re[3]: Какой массив расходует наименьшее количество памяти?
Здравствуйте, Silver_s, Вы писали:
S_>Да не может это сказаться на производительности ArrayList.ToArray(typeof(MyType)), если эти строки вычитываются из базы, в какие-то хеш-таблицы внутренние вбиваются (внутри CLR), бессмыслено париться о массиве указателей на строки, 0.1% сэкономим, а смысл где? Я так понял строки в структурах?
Плохо понял вопрос, но попробую ответить. Select из базы возвращает нечто подобное
str1 str2
str1 str3
str1 str4
str5 str6
str5 str7
str5 str8
и т.д,
т.е. значения в первой колонке отсортированны и повторяются. Этот результирующий набор я преобразовываю в массив структур
public class MyClass
{
string field1;
string[] field2;
}
Как выяснилось, по этому массиву нужно не только пробегаться, а нужно по field1, искать соответствующий field2. Причем программист, отвечающий за бизнес логику, на отрез отказался, что бы я ему возвращал Hashtable. Мотивирует это тем, что он будет искать с помощью Array.BinarySearch, и что якобы BinarySearch быстрее чем извлечение значения по ключу в Hashtable.
P.S. Проблема ушла за рамки изначального вопроса, но я в любом случае хотел разобраться с изначально заданным вопросом. Спасибо всем ответившим.
Re[2]: Какой массив расходует наименьшее количество памяти?
Здравствуйте, TK, Вы писали:
TK>Тема была про массив структур. И ответы так-же были исходя из этого. Зачем надо приплетать сюда ссылочные типы — непонятно
структуры?
TK>Меньше всего будет расходовать массив структур(MyType[]). Для удобства работы можно взять CodeSmith который умеет генерировать типизированные версии будет аналог (ArrayList для структуры). VD>И какя разница будет с точки зрения расхода памяти с обычным ArrayList? TK>Внутри будет MyType[], а не object[] VD>Это никака не влияет на расход памяти, если речь идет о хранении ссылочных типов.
Смотри на нить дискуссии.
Posted via RSDN NNTP Server 1.9
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.