powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / OutOfMemoryException при чтении SqlDataReader
31 сообщений из 31, показаны все 2 страниц
OutOfMemoryException при чтении SqlDataReader
    #38129893
Belowzero2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго дня!

SQL SErver 2008 R2, RAM 16 Gb

Запрос на сервере:

Код: sql
1.
2.
3.
SELECT Posts, Threads, KeyHash, KeyWord 
FROM IndexContainer
WHERE KeyHash =  @Param



Поле Posts - varchar(max)

Код на клиенте:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SqlDataReader reader = command.ExecuteReader();

            try
            {
                while (reader.Read())
                {
                    Dictionary<string, object> rowData = new Dictionary<string, object>();
                    for (int FieldCounter = 0; FieldCounter < reader.FieldCount; FieldCounter++)
                    {
                        string colName = reader.GetName(FieldCounter);
                        
                        object val = reader[FieldCounter];
                        rowData[colName] = val;                       
                    }
                    res.Add(rowData);
                }
            }
            catch(Exception e)



Когда происходит чтение поля Posts (val = reader[FieldCounter]), где длина содержимого более 30 Mb, вылетает "Exception of type 'System.OutOfMemoryException' was thrown."
Пробовал заменить val = reader[FieldCounter] на reader.GetChars() - все то же самое.

Есть ли возможность прочитать длинную строку из БД?
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129903
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос не в длине конкретной строки, а в объеме, который ты пихаешь в несчастный Dictionary в цикле . Отсюда и переполнение памяти.
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129906
Belowzero2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ,

Именно в длине строки, исключение вылетает до добавления строки в словарь.
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129918
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2,

какая блин разница доили после??
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129922
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
странно, прошло уже полчаса, а ОРМ до сих пор не предложили



Belowzero2,

какова реальная длина большого поля? 2GB - это тоже больше 30MB
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129927
Belowzero2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos,
как какая разница? ошибка возникает при чтении из reader'а.
ОК, давайте уберем все лишнее. Теперь код выглядит так:

Код: c#
1.
2.
3.
SqlDataReader reader = command.ExecuteReader();
reader.Read();
object val = reader[0];



Почему сейчас вылетает?

Да, актуальная длина данных в поле около 30 Mb, до 2 Gb очень далеко
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129929
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2,

а скоко памяти уже пожрала твоя прога до этого чтения?
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129931
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2Да, актуальная длина данных в поле около 30 Mb, до 2 Gb очень далекоа сколько данных в памяти уже к этому моменту?
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129933
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2,

ты сначала запроси память, а потом читай если память доступная имеется
а то все время будешь натыкаться на аутофмемари
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129934
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

интересно а ORM с outofmem как то борятся?
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129936
Belowzero2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos,

Памяти свободной физической еще около 10 Gb на этот момент.

А как запросить памяти в данном контексте?
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129940
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2,

а приложение 32-битное? тогда и 500GB свободных не поможет
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129942
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2,

ну не знаю какая там ОС, прога (32-64) и т.д.
а память можно так

Код: c#
1.
2.
3.
4.
                          .... 
                           int memreq = (int)(1 + rslt / kb);
                           memFailPoint = new MemoryFailPoint(memreq);
                           .... 
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129944
Belowzero2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos,

Все 64-битное
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129945
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2,

тогда дело не в этом скорее всего
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129946
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2,

гавнакодец
Код: sql
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.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            var memSize = 30 * 1024 * 1024;

            try
            {
                // Оно лишь логически проверяет/резервирует если не достаточно, то Exception
                using (var mfp = new System.Runtime.MemoryFailPoint(memSize))
                {
                    var s = new String('c', memSize);
                }
            }
            catch (InsufficientMemoryException ex)
            {
                // Памяти мало, предпринимай меры
                Console.WriteLine(ex);
            }
        }
    }
}




Belowzero2, а что ты хочешь делать в своем коде с полем 30 МБ?
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129948
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosИзопропил,

интересно а ORM с outofmem как то борятся?
wrapper'ами для LOB

просто ленивой загрузки недостаточно
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129950
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

Опередил.

---

Автор, на какой итеррации цикла аутофмемори? Если на первой, то кидай тип колонки того самого поля в БД. Или минимальный пример, на котором воспроизводится. И скажи что ты хочешь делать, а то вдруг гвозди забивать, а микроскоп жалко, можно и камешком.
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129951
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

ну а если без блоб? какая та предварительная проверка на доступность памяти там есть?
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129953
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosИзопропил,

ну а если без блоб? какая та предварительная проверка на доступность памяти там есть?

ORM в кишках читает тем же datareader'ом, так что пофиг (я про EF). Да и проверки скорее всего нет.
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129959
Belowzero2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lord British,

В поле находится закодированный inverted index, по которому потом находятся сообщения из другой таблицы. Что-то типа поискового движка.

Да, вылетает на первой же итерации. Если в выборке нет полей с длиной >30M, все хорошо.

Поле типа varchar(max) - вы это спрашивали?
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129968
Belowzero2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сдается мне, что передавать длинные строки MSSQL через ADO просто так не будет, где-то параметры связанные с памятью может нужно установить. Побьюсь еще немного, и буду хранить индекс в текстовых файлах - чуть медленнее будет робить, но надежнее
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129983
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2,

их считывают при необхдимости в них
Код: c#
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 (SqlCommand com = new SqlCommand())
                        {
                            com.Connection = conn;
                            com.CommandTimeout = cmdtimeout;
                            com.CommandType = CommandType.Text;
                            com.CommandText = sql;
                            SqlDataReader reader = com.ExecuteReader(CommandBehavior.SequentialAccess);
                            if (reader.HasRows)
                            {
                                SplashScreenManager.ShowForm(this, typeof(WaitForm1), true, true, false);
                                
                                string path = Path.GetTempPath() + (sender as DevExpress.XtraEditors.HyperLinkEdit).Text;
                                FileStream stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
                                BinaryWriter writer = new BinaryWriter(stream);
                                int bufferSize = 100;
                                byte[] outByte = new byte[bufferSize];
                                long retval;
                                long startIndex = 0;
                                while (reader.Read())
                                {
                                    retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize);
                                    while (retval == bufferSize)
                                    {
                                        writer.Write(outByte);
                                        writer.Flush();
                                        startIndex += bufferSize;
                                        retval = reader.GetBytes(0, startIndex, outByte, 0, bufferSize);
                                    }
                                    writer.Write(outByte, 0, (int)retval);
                                    writer.Flush();
                                }
                                writer.Close();
                                stream.Close();
                                reader.Close();
                          ............
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129993
Belowzero2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ViPRos,
Прошу прощения, невольно ввел вас в заблуждение. Вопрос не в базе данных вообще, а в создании длинных строк. .NET почему-то не может создать длинную строку (размер данных оказался около 250M)

То есть в примере

Код: c#
1.
2.
3.
4.
5.
const int bufSize = 265000000;
        
char[] buffer = new char[bufSize];
            
string st = new string(buffer);



буфер создается, а вот создание строки вылетает.

Разбираемся дальше.
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38129994
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2, дак вам ViPRos и показал, как застолбить участок памяти фрагмента райдера от от смещения при выборе места для строки менеджером памяти, другой вопрос, есть ли у вас место под массив строки, как бы это не одно и тоже - есть ли память...
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38130017
LameUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А обязательно всю строку хранить в памяти?
Может есть смысл попробовать через stream писать в локальный файл частями (так же и считывать)?
Сам недавно боролся с аналогичной проблемой, stream помог.
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38130054
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Belowzero2буфер создается, а вот создание строки вылетает.

Разбираемся дальше.
зачем массив в строку превращать? при таком размере вряд-ли полезными будут стандартные строковые операции
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38130155
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор, забэкапь базу с одной табличкой с этим 30-метровым varchar(max) и давай сюда.
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38130535
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в создании длинных строк. .NET почему-то не может создать длинную строку (размер данных оказался около 250M)




гавнакодец (обьем String ~ 2Gb)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true"></gcAllowVeryLargeObjects>
  </runtime>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>



Код: sql
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.
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Linq;
using System.Runtime;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var totalMem = GC.GetTotalMemory(true);
                using (var mpf = new MemoryFailPoint(2048))
                {
                    var str = new String('q', 1024 * 1024 * 1000);
                    Console.WriteLine("Allocated");
                }
            }
            catch (InsufficientMemoryException ex)
            {
                Console.WriteLine("{0}", ex.Message);
            }

            Console.ReadLine();

        }
    }
}





Стандартными средствами врядли можно выжать больше. Для byte[] массивов едва ли картина краше (ограничение на indexer), а для массивов типа MyStruct[] обьем может быть много больше, но количество элементов ограничено размером indexer'a.
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38130551
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. Компилить надо пд x64, я тестировал в release.
...
Рейтинг: 0 / 0
OutOfMemoryException при чтении SqlDataReader
    #38130561
Lord British
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS. По теме воздержусь :)
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / OutOfMemoryException при чтении SqlDataReader
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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