|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Мне нужно написать такой метод который принимает два Int64 типа параметра и возвращает заполненный List значениями между этими параметрами. public List<long> GetList(long beginNumber, long endNumber) { var numbers = new List<long>(); for (var number = beginNumber; number <= endNumber; number++) numbers.Add(number); return numbers; } Написал так, но при передаче beginNumber = 111222333444 и endNumber = 999888777666 выходить SystemOutOfMemoryException? Как по другому написать этот метод? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 12:13 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Amankeldi, Изучите, как работает yield return . Хотя у меня нет уверенности, что на приведении ToList() не получится тот же OutOfMemory. Если так, то - чего хотите, не влезает такой список в память, увы и ах. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 12:27 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Amankeldi ! Ради интереса сколько памяти у твоего компа? И ради интереса подсчитаем сколько тебе памяти надо для хранения твоего List<long> ? endNumber = 999888777666 beginNumber = 111222333444 Т.е. нужно хранить в памяти 888666444222 Int64 Сколько на это памяти? 888666444222 * 64 = 56 874 652 430 208 бит или где-то 6621 Гбайт... Дык сколько у твоего компа памяти? Ну максимум 6-10 Gb, а то и меньше... Че ерундой занимаешься... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 12:35 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Владимир СА, Ну, IEnumerable в принципе может хранить хоть весь натуральный ряд. На худой конец, можно попробовать отнаследоваться от List<long>, добавить в данные класса IEnumerable<long> и переопределить методы, обращаясь к нему, хотя делать так настоятельно не рекомендуется без веской причины. То есть, позволю себе усомниться в том, что ТС позарез нужно возвращать именно "заполненный List". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 13:09 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Amankeldi, Давай немного посчитаем. У тебя значения от 111222333444 до 999888777666 включительно. Это значит что у нас 999888777666-111222333444+1=888666444223 элементов. Каждый элемент занимает 8 байт. Это будет 888666444223*8 = 7109331553784 байтов = 6 Тб. Врядли у тебя достаточно ОЗУ для такого объема данных. И это мы еще не считали накладные расходы на хранение самого массива. Зачем тебе такой большой объем данных? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 13:45 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Abstraction ! Дык по коду видно, что он его заполняет... и хочет получить "заполненный" List<long>. Может я что-то недопонял? AbstractionНу, IEnumerable в принципе может хранить хоть весь натуральный ряд...Дык это не содержать его ВЕСЬ в памяти, а переходить от элемента к элементу, который вычисляется налету... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 13:46 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Владимир САAbstraction ! Дык по коду видно, что он его заполняет... и хочет получить "заполненный" List<long>. Может я что-то недопонял?ТС же спрашивает:авторКак по-другому написать этот метод? Вот я и пытаюсь придумать - как. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 13:50 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Так задачу поставили. Эта номера бланков. С каждым бланком делается какие-то операции (бланк определяется номером). В БД храню первый и последний номер бланка. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 13:53 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
AmankeldiТак задачу поставили. Эта номера бланков. С каждым бланком делается какие-то операции (бланк определяется номером). В БД храню первый и последний номер бланка.Не надо составлять этот список... А просто обрабатывать каждый бланк в цикле... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 13:55 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
AmankeldiТак задачу поставили. Эта номера бланков. С каждым бланком делается какие-то операции (бланк определяется номером). В БД храню первый и последний номер бланка.Не вижу требования использования типа данных List<long> в приведённой формулировке. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 15:05 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
AmankeldiЭта номера бланков Номера бланков - это не числа, а строки ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 15:56 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Amankeldi, Используйте такую штуку, она позволит пролистать весь диапазон без переполнения памяти. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2013, 17:39 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
AmankeldiМне нужно написать такой метод который принимает два Int64 типа параметра и возвращает заполненный List значениями между этими параметрами. public List<long> GetList(long beginNumber, long endNumber) { var numbers = new List<long>(); for (var number = beginNumber; number <= endNumber; number++) numbers.Add(number); return numbers; } Написал так, но при передаче beginNumber = 111222333444 и endNumber = 999888777666 выходить SystemOutOfMemoryException? Как по другому написать этот метод? Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 10:47 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
pation Код: c# 1.
Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 11:48 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
МСУpation Код: c# 1.
Код: c# 1.
А в чём смысл? Рано или поздно (LINQ), а придётся вернуть гигансткий список, и памяти не хватит даже у монструозного сервера. Может, организовать что-то вроде транзакций? Никто ведь не пытается вернуть из БД сразу всю выборку за раз, если она слишком большая по объёму. Делают транзакции с запоминанием текущей позиции. Я такое делал, когда надо было обновлять БД между ВинМобайл устройством и на сервере. Там ограничение на процесс, как известно, 32 МБ - каменный век по нынешним меркам. Поэтому приходилось писать на серверной стороне хранимую процедуру, которая пакетами толкала на клиента данные, а сама запоминала текущую позицию - границу между пакетами. Но там всё это дело было вкупе с Synchronization Services, а тут проще будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 12:43 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
user7320А в чём смысл? Рано или поздно (LINQ), а придётся вернуть гигансткий список, и памяти не хватит даже у монструозного сервера. Это еще раз доказывает, что ты не знаком IEnumerable и принципом работы Enumerable.Range. Списка не будет, будет простой перебор (причем отложенный). Шагом марш читать документацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 12:50 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
МСУuser7320А в чём смысл? Рано или поздно (LINQ), а придётся вернуть гигансткий список, и памяти не хватит даже у монструозного сервера. Это еще раз доказывает, что ты не знаком IEnumerable и принципом работы Enumerable.Range. Списка не будет, будет простой перебор (причем отложенный). Шагом марш читать документацию. Так ему же нужен список, а не перебор. Перебором любой сможет, а вы список верните. И это, когда речь идёт об общении по сети, то не лучше ли обрабатывать не перебором, а пакетно? Каждый бланк загружать - это ж сколько обращений к серверу делать надо. Лучше сразу грузануть тысчонку-другую и ждать, пока она не переварится. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 13:11 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
user7320Так ему же нужен список, а не перебор. Перебором любой сможет, а вы список верните. Ты каким местом читаешь топик? Для его задачи нужен именно перебор ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 13:13 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
МСУЭто еще раз доказывает, что ты не знаком IEnumerable и принципом работы Enumerable.Range Может я тоже неправильно понимаю. Я прочитал MSDN так - если обратится по индексу в листе, то действительно, загрузится только соответсвующий индексу экземпляр, а если сделать Foreach, то это приведет к загрузке всего списка? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 13:59 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Cat2Может я тоже неправильно понимаю. Я прочитал MSDN так - если обратится по индексу в листе, то действительно, загрузится только соответсвующий индексу экземпляр, а если сделать Foreach, то это приведет к загрузке всего списка? Еще раз, листа никакого не должно быть - должен быть IEnumerable. Foreach - фетчит, а не загружает в память. Загружают в память ToList(), ToArray(), ToDictionary() и т.д. Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 14:32 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
МСУForeach - фетчит, а не загружает в память. Спасибо, понял ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2013, 14:34 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
МСУ. Спасибо вам. Про перебор я все понял. Но получается я никак не могу создать такой список, или коллекцию , или множество? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 07:39 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
AmankeldiМСУ. Спасибо вам. Про перебор я все понял. Но получается я никак не могу создать такой список, или коллекцию , или множество?Цель? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 08:05 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Amankeldi, держать все элементы в пямяти одновременно не получится из-за слишком большого объема, но при использовании IEnumerable<T> тебе это и не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 11:39 |
|
Здравствуйте!
|
|||
---|---|---|---|
#18+
Такая ситуация... public string GetNotUsedTickets(long beginNumber, long endNumber) { long BeginNumber = beginNumber; // начальный номер бланка long EndNumber = endNumber; // конечный номер бланка // long TicketCount = EndNumber - BeginNumber + 1; (Так мы узнаем количество выданных бланков) // Когда мы используем какой-то бланк, номер бланка записывается в таблицу InspUsedTickets (Таблица содержит номера использованных бланков) //Получаем список использованных бланков List<long> UsedTickets = (from ut in dbDiagInsp.Ctx.InspUsedTickets select ut.Number).ToList(); //Cписок оставщихся (не использованных) бланков var list = new List<Data>(); foreach (var tic in GetData(BeginNumber, EndNumber).Except(UsedTickets)) { var data = list.FirstOrDefault(d => d.End == tic - 1); if (data == null) list.Add(new Data(tic)); else data.End = tic; } return string.Join(", ", list.OrderBy(d => d.Begin).Select(d => d.ToString())); // Возвращаем список не использованных бланков в виде таких строк // } private static IEnumerable<long> GetData(long start, long end) { var i = start; while (i <= end) yield return i++; } private sealed class Data { public Data(long ticket) { Begin = ticket; End = ticket; } public long Begin { get; private set; } public long End { get; set; } public override string ToString() { if (Begin == End) return Begin.ToString(); return string.Format("{0}-{1}", Begin, End); } } В данный момент мой метод обрабатывает 60,000,000 количество бланков. Данные моей машины : Memory - 4 Gb, Intel Core i5-3210M, 2.5 Ghz Вот теперь вопрос можно ли как-то оптимизировать, или корректировать мой код, чтобы можно было обработать около 888666444222 бланков? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2013, 13:39 |
|
|
start [/forum/topic.php?desktop=1&fid=20&tid=1404842]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 186ms |
0 / 0 |