powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO.Net и большие объемы данных
17 сообщений из 42, страница 2 из 2
ADO.Net и большие объемы данных
    #36030719
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antoshka

харош бездумно копипастить, ты не ответил на главный вопрос - какого фига не используется виртуальная память?
и, да, что делать если у меня x64? :)
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36032455
Antoshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыAntoshka

харош бездумно копипастить, ты не ответил на главный вопрос - какого фига не используется виртуальная память?
и, да, что делать если у меня x64? :)

Ты хоть читаешь, то что пишут? Если у тебя x64, то всё будет ОК. А вот если на x86 у тебя будет 3 гБ пользовательских данных, то куда ты их уложишь, если у тебя всего порядка 2000 Мб адресного пространства. Даже если они будут лежать в свопе, то всё равно место в АП процесса они занимают. Чтобы обойти эту беду, необходимо организовать специальное окно в адресном пространстве процесса, в которое при необходимости маппить необходимые порции данных из файла подкачки. Кстати, примерно так работают с очень большими файлами: замаппили кусочек в память, обработали, отменили маппинг - перешли к следующему куску.
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36032879
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antoshka
Ты хоть читаешь, то что пишут? Если у тебя x64, то всё будет ОК.

твоя проблема в том, что как раз ты тут и не читаешь. Про архитектуру процессора никто даже не заикался, кроме тебя с твоим "Win32".


дальше у тебя много слов опять не по теме, комментировать не буду. Повторю исходный вопрос - он был не в том, почему приложение не может воспользоваться более чем N гигабайтами оперативы, он был в том, почему .net не использует виртуальную память. Разницу способен понять? И ответ на этот вопрос лежит не в статьях про Win32, а в описании CLR и сборщика мусора и особенностях их работы. Иди читай, потом расскажешь.
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36033232
Antoshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, вернёмся к истокам...

ТрудностьВ_ADOДобрый день!
И вопрос в догонку - почему с#, framework, ado.net не используют виртуальную память, а вылетают с исключением "Out of memory"? Может, настройка такая есть?

Ты хочешь сказать, что дотнет получает память от операционной системы в обход стандратного WinAPI? Ты ошибаешься, он также точно где-то в своих дебрях вызовает VirtualAlloc, который имеет те же самые грабли с "Out of memory", о которых я рассказывал. Ниже приведена программа, которая легко это доказывает.

Код: plaintext
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.
using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        /// <summary>
        /// Размер одного выделяемого блока в байтах
        /// </summary>
        private const int blockSize = 1000 * 1024 * 1024;

        static void Main(string[] args)
        {
            // список для хранения ссылок, чтобы GC не пытался что-нибудь осводобить
            List<byte[]> list = new List<byte[]>();

            try
            {
                //выделяем память блоками
                for (int i = 1; ; i++)
                {
                    list.Add(new byte[blockSize]);
                    Console.WriteLine(i);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            } 

            Console.ReadLine();
        }
    }
}

Запусти, и увидишь, что далее двух шагов она не пройдёт, если, конечно процесс не x64 (в этом случае она будет продолжать работать до исчерпания ОЗУ и файла подкачки). Но, опять же, топикстартер не упомянул версию своей операционной системы.
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36033552
cyber-fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не нужно показывать все данные сразу, пусть пользователь/автор программы конкретизирует выборку и на одну проблему меньше
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36034552
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antoshka
Запусти, и увидишь, что далее двух шагов она не пройдёт, если, конечно процесс не x64 (в этом случае она будет продолжать работать до исчерпания ОЗУ и файла подкачки). Но, опять же, топикстартер не упомянул версию своей операционной системы.
ололо, а у меня даже один шаг ниасилила, к чему бы это? винда 2008 x32, 2гб оперативы.

давай усложним твой пример, ну так чтобы память реально выделялась и использовалась, а не просто резервировалась под возможные нужды.

Код: plaintext
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.
	class Program
	{
		/// <summary>
		/// Размер одного выделяемого блока в байтах
		/// </summary>
		private const int blockSize = 1024 * 1024;

		static void Main(string[] args)
		{
			// список для хранения ссылок, чтобы GC не пытался что-нибудь осводобить
			List<byte[]> list = new List<byte[]>();

			var r = new Random();
			try
			{
				//выделяем память блоками
				for (int i = 1; ; i++)
				{
					var b = new byte[blockSize];
					for (var j = 0; j < b.Length; j++)
						b[j] = (byte)r.Next();
					list.Add(b);
					Console.WriteLine(i);
				}
			}
			catch (Exception e)
			{
				Console.WriteLine(e.Message);
			}

			Console.ReadLine();
		}
	}
сиди и наблюдай в таскменеджере за процессом, потом расскажешь на скольки у тебя отвалилось и почему это оно так происходит. И, кстати, не забудь заодно поведать нам, какая у тебя ось и сколько памяти стоит.
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36034619
Antoshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы
ололо, а у меня даже один шаг ниасилила, к чему бы это? винда 2008 x32, 2гб оперативы.

:) и ты тут ещё про своп рассуждаешь..

зы
давай усложним твой пример, ну так чтобы память реально выделялась и использовалась, а не просто резервировалась под возможные нужды.
Да будет тебе известно, что дотнет при выделении памяти усердно инициализирует её нулями. Так что нет никакой разницы между моим и твоим кодом за исключением размера блока.

зы
сиди и наблюдай в таскменеджере за процессом, потом расскажешь на скольки у тебя отвалилось и почему это оно так происходит. И, кстати, не забудь заодно поведать нам, какая у тебя ось и сколько памяти стоит.

Результаты:
1) моя рабочая машина, Vista x64 2Gb - моя прога доходила до 4-5 и вываливалась, что соответствовало 4-5 Гб всей доступной памяти (ОЗУ+файл подкачки). Твоя прога честно дошла до 5334. Результат по объёму аналогичный;
2) тестовый сервер Win 2003 x86, 16 Gb, /PAE включен. Моя прога стабильно отваливалась после цифры 2, твоя - после 1725. Включи мозг и подумай, почему, при наличии дофига ОЗУ + хз сколько места в файле подкачки, больше двух гигов процесс сожрать не может?
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36162897
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Случайно наткнулся на топик. Жестко Антошка упертого рогом в забор зы отодрал :)
Про ваш спор - баян столетней давности про распределение памяти под своппинг, зы - двойка :)
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36163740
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ, тебя-то драли, дерут и драть будут, до сих пор иногда ржу над твоими перлами. Надолго разбанили-то?

Antoshka,
к сожалению, в разгар спора мне не хватило времени проверить один момент, поскольку я уехал на несколько недель, а потом забыл :( (МСУ может даже не пытаться глумиться что это типа отмазка, данный любитель некропостов может поискать мои сообщения за этот период - не найдет ни одного).

момент заключался в том, чтобы уточнить, как это работало на старом .нет, поскольку не отрицаю что в новом они много чего улучшили, включая работу с памятью, а со времен 1.1 я помнил что на виртуальную память были ограничения. Общая суть такая, что своп и сборщик мусора плохо совместимы с собой, поскольку своппинг пытается засунуть неиспользуемые страницы на диск, а сборщик - найти среди неиспользуемых то, что можно выкинуть, поднимая тем самым страницы с диска обратно в память. Несмотря на то, что синтетические тесты показывают возможность выделения большого объема на 64-битной ОС, в реальности, если далеко выбраться за пределы доступной физической, реальное приложение начнет сильно тормозить себя и систему в целом. Хуже, если несколько .нет приложений работают на одном сервере (веб сервер, например), тогда у них начнется конкуренция за физическую память, что приведет к общей деградации производительности. Очевидно, что то, что я написал выше, справедливо для любых приложений - нет свободной памяти, система свопит и тормозит, но с .net этот эффект значительно хуже, потому что сборщик мусора не дает страницам долго покоиться на диске, в отличие от обычных приложений, которые можно надолго частично схоронить.

авторДа будет тебе известно, что дотнет при выделении памяти усердно инициализирует её нулями. Так что нет никакой разницы между моим и твоим кодом за исключением размера блока.
разница, как ни странно, есть, и её отчетливо видно в таскменеджере. Чтобы её объяснить - надо дальше углубляться в работу менеджера памяти, сейчас нет на это времени.
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36163867
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет времени, работа, ... Зы, Вы похожи на нашкодившего первоклассника :)
Да не расстраивайтесь так, все когда-то с чего-то начинали. У Вас еще всё впереди :)
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36163981
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ТрудностьВ_ADO, 30 апр 09, 18:30 [7135839]
> ... При этом на 60 тыс. записей ...
Здесь рассказано как строился прототип защищенных распределенных многоуровневых информационных систем. Задачу страничной подкачки также пришлось решать. Я сразу отбросил вариант закачки в кеш клиентского компьютера полной выборки запроса. Не реально это по медленным каналам. Жизнеспособна только страничная подкачка. Разные варианты реализации её приведены в статьях.
На миллиарде записей не проверял. Но на 60 тыс. не должно быть существенной разницы во времени получения первой и последней страницы.

С уважением, Владимир.
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36163984
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ТрудностьВ_ADO, 30 апр 09, 18:30 [7135839]
> ... При этом на 60 тыс. записей ...
Здесь рассказано как строился прототип защищенных распределенных многоуровневых информационных систем. Задачу страничной подкачки также пришлось решать. Я сразу отбросил вариант закачки в кеш клиентского компьютера полной выборки запроса. Не реально это по медленным каналам. Жизнеспособна только страничная подкачка. Разные варианты реализации её приведены в статьях.
На миллиарде записей не проверял. Но на 60 тыс. не должно быть существенной разницы во времени получения первой и последней страницы.

С уважением, Владимир.
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36246278
krudensoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использовать серверный курсор и датагрид в виртуальном режиме.

У меня на 40 тыс записей открывает курсор около полусекунды, затем работает (скроллит) очень быстро. Так же реализовал сортировку, поиск и фильтрацию. Народ доволен.

Память на клиенте практически не используется (полмегабайта - можно пренебречь). В памяти держится только то, что выведено на экране.
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36246458
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
серверные курсоры обладают феноменально низкой производительностью, кроме того, не имеют должной поддержки со стороны ado.net. Наверное, ты все-таки хотел воспользоваться пейджингом?
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36334112
По поводу SQL Management Studio.

Информирую.
Студия использует диск для хранения прочитаных с сервера данных.
Аналогичным образом делает старый добрый jet (движок Access), но он более интеллектуальный и поддерживает разные курсоры с разной функциональностью.

Только студийный вариант свой и не поддерживает фильтров и сортировки.
В памяти хранятся только указатели на смещение в этом файле кэша (я так думаю).
Данные читаются только в одном направлении, пока не будет достигнута последняя запись. Скажем, нельзя быстро перейти в конец и листать в обратном направлении.
Используется ADO.NET forward-only курсор (DataReader).

С уважением,
Павел
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36492733
krudensoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы,

Для отчитки по 100 строк для показа страниц на экране - самое то.
У меня написан класс на iBindingList - все прекрасно вяжеться с гридом.

Но есть несколько минусов:
1. Не сделать нормальный поиск - все равно придется все перебрать
2. Фильтрация и сортировка - только для запросов (select) для хранимок не получится (или нужно задавать жестко параметры для хранимок)

Все это из-за того, что на скуле нет нормальных средств для выборки из запроса по принципу "с 100 записи выбрать 200 штук".

Но для простых списков (например справочник товаров (>100 тыс), список накладных и т.п.) работает нормально, гораздо лучше, чем тянуть все в память
...
Рейтинг: 0 / 0
ADO.Net и большие объемы данных
    #36492757
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
krudensoft1. Не сделать нормальный поиск - все равно придется все перебрать
Вы просто не умеете писать SQL-запросы или пользовать ORM.

krudensoft2. Фильтрация и сортировка - только для запросов (select) для хранимок не получится (или нужно задавать жестко параметры для хранимок)
Вы просто не умеете писать SQL-запросы или пользовать ORM.

krudensoftВсе это из-за того, что на скуле нет нормальных средств для выборки из запроса по принципу "с 100 записи выбрать 200 штук".
Вы просто не умеете писать SQL-запросы или пользовать ORM.

krudensoftНо для простых списков (например справочник товаров (>100 тыс), список накладных и т.п.) работает нормально, гораздо лучше, чем тянуть все в память
Вы просто не умеете писать SQL-запросы или пользовать ORM.
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ADO.Net и большие объемы данных
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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