powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Здравствуйте!
25 сообщений из 53, страница 1 из 3
Здравствуйте!
    #38218565
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?
Как по другому написать этот метод?
...
Рейтинг: 0 / 0
Здравствуйте!
    #38218592
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amankeldi,

Изучите, как работает yield return . Хотя у меня нет уверенности, что на приведении ToList() не получится тот же OutOfMemory. Если так, то - чего хотите, не влезает такой список в память, увы и ах.
...
Рейтинг: 0 / 0
Здравствуйте!
    #38218605
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amankeldi !
Ради интереса сколько памяти у твоего компа?
И ради интереса подсчитаем сколько тебе памяти надо для хранения твоего List<long> ?
endNumber = 999888777666
beginNumber = 111222333444
Т.е. нужно хранить в памяти 888666444222 Int64
Сколько на это памяти?
888666444222 * 64 = 56 874 652 430 208 бит или где-то 6621 Гбайт...

Дык сколько у твоего компа памяти? Ну максимум 6-10 Gb, а то и меньше...

Че ерундой занимаешься...
...
Рейтинг: 0 / 0
Здравствуйте!
    #38218657
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир СА,

Ну, IEnumerable в принципе может хранить хоть весь натуральный ряд. На худой конец, можно попробовать отнаследоваться от List<long>, добавить в данные класса IEnumerable<long> и переопределить методы, обращаясь к нему, хотя делать так настоятельно не рекомендуется без веской причины.
То есть, позволю себе усомниться в том, что ТС позарез нужно возвращать именно "заполненный List".
...
Рейтинг: 0 / 0
Здравствуйте!
    #38218731
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amankeldi,

Давай немного посчитаем. У тебя значения от 111222333444 до 999888777666 включительно. Это значит что у нас 999888777666-111222333444+1=888666444223 элементов. Каждый элемент занимает 8 байт. Это будет 888666444223*8 = 7109331553784 байтов = 6 Тб. Врядли у тебя достаточно ОЗУ для такого объема данных. И это мы еще не считали накладные расходы на хранение самого массива.

Зачем тебе такой большой объем данных?
...
Рейтинг: 0 / 0
Здравствуйте!
    #38218733
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Abstraction !
Дык по коду видно, что он его заполняет... и хочет получить "заполненный" List<long>.
Может я что-то недопонял?

AbstractionНу, IEnumerable в принципе может хранить хоть весь натуральный ряд...Дык это не содержать его ВЕСЬ в памяти, а переходить от элемента к элементу, который вычисляется налету...
...
Рейтинг: 0 / 0
Здравствуйте!
    #38218741
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САAbstraction !
Дык по коду видно, что он его заполняет... и хочет получить "заполненный" List<long>.
Может я что-то недопонял?ТС же спрашивает:авторКак по-другому написать этот метод? Вот я и пытаюсь придумать - как.
...
Рейтинг: 0 / 0
Здравствуйте!
    #38218747
Amankeldi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так задачу поставили. Эта номера бланков. С каждым бланком делается какие-то операции (бланк определяется номером). В БД храню первый и последний номер бланка.
...
Рейтинг: 0 / 0
Здравствуйте!
    #38218751
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmankeldiТак задачу поставили. Эта номера бланков. С каждым бланком делается какие-то операции (бланк определяется номером). В БД храню первый и последний номер бланка.Не надо составлять этот список... А просто обрабатывать каждый бланк в цикле...
...
Рейтинг: 0 / 0
Здравствуйте!
    #38218913
Abstraction
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmankeldiТак задачу поставили. Эта номера бланков. С каждым бланком делается какие-то операции (бланк определяется номером). В БД храню первый и последний номер бланка.Не вижу требования использования типа данных List<long> в приведённой формулировке.
...
Рейтинг: 0 / 0
Здравствуйте!
    #38219026
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
AmankeldiЭта номера бланков
Номера бланков - это не числа, а строки
...
Рейтинг: 0 / 0
Здравствуйте!
    #38219240
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amankeldi,
Используйте такую штуку, она позволит пролистать весь диапазон без переполнения памяти.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 static IEnumerable<long> GetData(long start, long end)
        {
            if (start < 0)
                throw new ArgumentOutOfRangeException("start");
            if(end<0)
                throw new ArgumentOutOfRangeException("end");
            if (start > end)
                throw new ArgumentException("Окончание диапазона не может быть меньше чем начало");
            var i = start;
            while (i <= end)
                yield return i++;                
            
        }
...
Рейтинг: 0 / 0
Здравствуйте!
    #38221387
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
System.Linq.Enumerable.Range(beginNumber, endNumber - beginNumber + 1);
...
Рейтинг: 0 / 0
Здравствуйте!
    #38221508
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pation
Код: c#
1.
System.Linq.Enumerable.Range(beginNumber, endNumber - beginNumber + 1);



Код: c#
1.
IEnumerable<int> Range(int start, int count)
...
Рейтинг: 0 / 0
Здравствуйте!
    #38221636
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУpation
Код: c#
1.
System.Linq.Enumerable.Range(beginNumber, endNumber - beginNumber + 1);



Код: c#
1.
IEnumerable<int> Range(int start, int count)


А в чём смысл? Рано или поздно (LINQ), а придётся вернуть гигансткий список, и памяти не хватит даже у монструозного сервера.

Может, организовать что-то вроде транзакций? Никто ведь не пытается вернуть из БД сразу всю выборку за раз, если она слишком большая по объёму. Делают транзакции с запоминанием текущей позиции. Я такое делал, когда надо было обновлять БД между ВинМобайл устройством и на сервере. Там ограничение на процесс, как известно, 32 МБ - каменный век по нынешним меркам. Поэтому приходилось писать на серверной стороне хранимую процедуру, которая пакетами толкала на клиента данные, а сама запоминала текущую позицию - границу между пакетами. Но там всё это дело было вкупе с Synchronization Services, а тут проще будет.
...
Рейтинг: 0 / 0
Здравствуйте!
    #38221649
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320А в чём смысл? Рано или поздно (LINQ), а придётся вернуть гигансткий список, и памяти не хватит даже у монструозного сервера.
Это еще раз доказывает, что ты не знаком IEnumerable и принципом работы Enumerable.Range.
Списка не будет, будет простой перебор (причем отложенный). Шагом марш читать документацию.
...
Рейтинг: 0 / 0
Здравствуйте!
    #38221691
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУuser7320А в чём смысл? Рано или поздно (LINQ), а придётся вернуть гигансткий список, и памяти не хватит даже у монструозного сервера.
Это еще раз доказывает, что ты не знаком IEnumerable и принципом работы Enumerable.Range.
Списка не будет, будет простой перебор (причем отложенный). Шагом марш читать документацию.
Так ему же нужен список, а не перебор. Перебором любой сможет, а вы список верните.

И это, когда речь идёт об общении по сети, то не лучше ли обрабатывать не перебором, а пакетно? Каждый бланк загружать - это ж сколько обращений к серверу делать надо. Лучше сразу грузануть тысчонку-другую и ждать, пока она не переварится.
...
Рейтинг: 0 / 0
Здравствуйте!
    #38221697
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Так ему же нужен список, а не перебор. Перебором любой сможет, а вы список верните.
Ты каким местом читаешь топик? Для его задачи нужен именно перебор
...
Рейтинг: 0 / 0
Здравствуйте!
    #38221774
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
МСУЭто еще раз доказывает, что ты не знаком IEnumerable и принципом работы Enumerable.Range
Может я тоже неправильно понимаю. Я прочитал MSDN так - если обратится по индексу в листе, то действительно, загрузится только соответсвующий индексу экземпляр, а если сделать Foreach, то это приведет к загрузке всего списка?
...
Рейтинг: 0 / 0
Здравствуйте!
    #38221852
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Может я тоже неправильно понимаю. Я прочитал MSDN так - если обратится по индексу в листе, то действительно, загрузится только соответсвующий индексу экземпляр, а если сделать Foreach, то это приведет к загрузке всего списка?
Еще раз, листа никакого не должно быть - должен быть IEnumerable. Foreach - фетчит, а не загружает в память. Загружают в память ToList(), ToArray(), ToDictionary() и т.д.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
// Список
var list = Enumerable.Range(1, int.MaxValue).ToList(); // System.OutOfMemoryException

// IEnumerable
foreach (int item in Enumerable.Range(1, int.MaxValue)) // Ok
{
                
}
...
Рейтинг: 0 / 0
Здравствуйте!
    #38221857
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
МСУForeach - фетчит, а не загружает в память.
Спасибо, понял
...
Рейтинг: 0 / 0
Здравствуйте!
    #38222883
Amankeldi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ. Спасибо вам. Про перебор я все понял. Но получается я никак не могу создать такой список, или коллекцию , или множество?
...
Рейтинг: 0 / 0
Здравствуйте!
    #38222895
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmankeldiМСУ. Спасибо вам. Про перебор я все понял. Но получается я никак не могу создать такой список, или коллекцию , или множество?Цель?
...
Рейтинг: 0 / 0
Здравствуйте!
    #38223184
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Amankeldi, держать все элементы в пямяти одновременно не получится из-за слишком большого объема, но при использовании IEnumerable<T> тебе это и не нужно.
...
Рейтинг: 0 / 0
Здравствуйте!
    #38223407
Amankeldi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такая ситуация...

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 бланков?
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Здравствуйте!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]