Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / OutOfMemoryException при чтении SqlDataReader / 25 сообщений из 31, страница 1 из 2
30.01.2013, 00:20
    #38129893
Belowzero2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OutOfMemoryException при чтении SqlDataReader
Всем доброго дня!

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
30.01.2013, 00:31
    #38129903
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OutOfMemoryException при чтении SqlDataReader
Вопрос не в длине конкретной строки, а в объеме, который ты пихаешь в несчастный Dictionary в цикле . Отсюда и переполнение памяти.
...
Рейтинг: 0 / 0
30.01.2013, 00:33
    #38129906
Belowzero2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OutOfMemoryException при чтении SqlDataReader
МСУ,

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

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



Belowzero2,

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

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



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

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

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

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

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

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

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

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

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

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

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

тогда дело не в этом скорее всего
...
Рейтинг: 0 / 0
30.01.2013, 01:33
    #38129946
Lord British
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OutOfMemoryException при чтении SqlDataReader
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
30.01.2013, 01:34
    #38129948
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OutOfMemoryException при чтении SqlDataReader
ViPRosИзопропил,

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

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

Опередил.

---

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

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

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

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

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

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

Поле типа varchar(max) - вы это спрашивали?
...
Рейтинг: 0 / 0
30.01.2013, 02:00
    #38129968
Belowzero2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OutOfMemoryException при чтении SqlDataReader
Сдается мне, что передавать длинные строки MSSQL через ADO просто так не будет, где-то параметры связанные с памятью может нужно установить. Побьюсь еще немного, и буду хранить индекс в текстовых файлах - чуть медленнее будет робить, но надежнее
...
Рейтинг: 0 / 0
30.01.2013, 02:41
    #38129983
ViPRos
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OutOfMemoryException при чтении SqlDataReader
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
30.01.2013, 03:31
    #38129993
Belowzero2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OutOfMemoryException при чтении SqlDataReader
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
30.01.2013, 03:43
    #38129994
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OutOfMemoryException при чтении SqlDataReader
Belowzero2, дак вам ViPRos и показал, как застолбить участок памяти фрагмента райдера от от смещения при выборе места для строки менеджером памяти, другой вопрос, есть ли у вас место под массив строки, как бы это не одно и тоже - есть ли память...
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / OutOfMemoryException при чтении SqlDataReader / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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