Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
0 / 0 / 0
Регистрация: 06.09.2010
Сообщений: 4

C# + SQL compact edition

06.09.2010, 15:53. Показов 3767. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Коллеги, добрый день!

Есть проблема в виде:
В течении определенного времени приложение накапливает данные - 3 коллекции.
В среднем, первые две коллекции по 40-60 тыс значений, третья 300-500 тыс. значений. По нажатию кнопки поочередно из этих коллекций данные инсертятся в таблицы Sql compact (одна запись любой коллекции - одна транзакция), однако в середине третьей коллекций возникает исключение memory out of range (процесс занимает 1300-1400 Мб памяти) и соответственно падает. Пробовал методы SqlCeConnection.Dispose() и SqlCeEngine.Dispose() каждые 1000 транзакций, помогает, но мало, реально освобождается 3-5Мб, в то время как прибавляется по 15-20. Вопрос в следующем, каким образом внести данные в Sqlcompact, либо куда и как внести этот массив данных.

Спасибо заранее.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.09.2010, 15:53
Ответы с готовыми решениями:

Как в Sql Server Compact Edition 4.0 задать связи между таблицами
Создал таблицы, а как задать связи между ними? VS 2012.

Создание БД в ms sql compact edition
Здравствуйте. Мне необходимо создать локальную бд sql compact edition в проекте. Я скачала и установила SQLite / SQL Server Compact...

Microsoft SQL Server Compact Edition
Привет, видел сдесь на форуме тему что можно использовать БД Microsoft SQL Server Compact Edition , для Microsoft SQL Server Compact...

10
49 / 49 / 15
Регистрация: 13.08.2010
Сообщений: 160
06.09.2010, 18:44
попробуй после каждой тысячи кроме всего написать GC.Collect()
0
0 / 0 / 0
Регистрация: 06.09.2010
Сообщений: 4
07.09.2010, 08:55  [ТС]
GC.Collect(); Есть после окончания каждой коллекции. Не помогает.

Добавлено через 13 часов 51 минуту
Пробовал выливать данные в файл, выливается плохо, если не сказать отвратительно, в файл пишется примерно каждая 10-ая итерация. Так что вопрос по прежнему открыт, либо пните в нужную сторону: где в Visual Studio во время отладки, во время паузы, посмотреть, куда девается память?
Спасибо.
0
49 / 49 / 15
Регистрация: 13.08.2010
Сообщений: 160
08.09.2010, 16:40
опубликуй пример, если GC.Collect() не помагает - значит гдето есть сылки на обькты которые не нужны. Нужно выходить из зоны видимости, только тогда вызывать GC.Collect() при таких условиях он будет иметь смысл. К примеру

0)
C#
1
2
3
4
5
6
7
8
void other_method()
{
for(i = 0; i< 100; i++)
{
//do some
GC.Collect();
}
}
1)
C#
1
2
3
4
5
6
7
8
9
void some_method()
{
//do some
GC.Collect()
}
void other_method()
{
for(i = 0; i< 100; i++)some_method();
}
2)
C#
1
2
3
4
5
6
7
8
9
10
11
12
void some_method()
{
//do some
}
void other_method()
{
for(i = 0; i< 100; i++)
{
some_method();
GC.Collect();
}
}
GC.Collect() будет реально принудительно освобождать память только в третьем случае
0
5 / 5 / 4
Регистрация: 06.05.2010
Сообщений: 180
09.09.2010, 07:36
Цитата Сообщение от while(i)k++ Посмотреть сообщение
Нужно выходить из зоны видимости, только тогда вызывать GC.Collect()
можно просто присвоить переменной, ссылающейся на объект, null. Тогда окажется, что на объект не ссылается ни одна переменная, и он тоже может быть удален. Хотя GC никогда не гарантирует, что все ненужные объеты, будет удалены во времяCollect().

Я думаю, что одно соединение не может весить полтора гига и нет смысла его диспозить. Оно не увеличивает свой размер, хоть если через него вставить миллион записей. Это нужно только если бы у тебя на каждую строчку создавалось по отдельному соединению и оказало бы 500 000 соединений в памяти, тогда диспозинье каждого соединений освободило бы много памяти. А код можешь выложить?

Я с CE шкой работал немного. Она туповата на больших данных, у меня БЛОБ больше 8 Кб не принимала. Может в ней самой проблема.
0
0 / 0 / 0
Регистрация: 06.09.2010
Сообщений: 4
09.09.2010, 15:47  [ТС]
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
private void FromListToSql()
        {
            int i = 0;
            try
            {
                while (FirstList.Count > 0)
                {
                    SqlCeCommand cmd = connection.CreateCommand();
                    cmd.CommandText =
                        "insert into FirstTable values(?,?,?)";
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.ExecuteScalar();
                    cmd = null;
                    FirstList.RemoveAt(0);
                    int a = i % 1000;
                    if (a == 0)
                    {
                        connection.Close();
                        connection.Dispose();
                        connection = null;                        
                        GC.Collect();
                        connection = new SqlCeConnection(engine.LocalConnectionString);
                        connection.Open();
                    }
                    
                    i++;                    
                }
                FirstList = null;
 
                connection.Close();
                connection.Dispose();
                connection = null;
                engine.Dispose();
                engine = null;
 
                GC.Collect();
 
                engine = new SqlCeEngine(blablabla);
                connection = new SqlCeConnection(engine.LocalConnectionString);
                connection.Open();
                
                while (SecondList.Count > 0)
                {
                    SqlCeCommand cmd = connection.CreateCommand();
                    cmd.CommandText =
                        "insert into SecondTable values(?,?,?,?,?)";
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.ExecuteScalar();
                    cmd = null;
                    SecondList.RemoveAt(0);
                    int a = i % 1000;
                    if (a == 0)
                    {
                        connection.Close();
                        connection.Dispose();
                        connection = null;
                        GC.Collect();
                        connection = new SqlCeConnection(engine.LocalConnectionString);
                        connection.Open();
                    }
 
                    i++;
                }
                SecondList = null;
 
                connection.Close();
                connection.Dispose();
                connection = null;
                engine.Dispose();
                engine = null;
 
                GC.Collect();
 
                engine = new SqlCeEngine(blablabla);
                connection = new SqlCeConnection(engine.LocalConnectionString);
                connection.Open();                
 
                while (ThirdList.Count > 0)
                {
                    SqlCeCommand cmd = connection.CreateCommand();
                    cmd.CommandText =
                        "insert into ThirdTable values(?,?,?,?,?,?,?,?)";
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.Parameters.Add
                    cmd.ExecuteScalar();
                    cmd = null;
                    ThirdList.RemoveAt(0);
                    int a = i % 1000;
                    if (a == 0)
                    {
                        connection.Close();
                        connection.Dispose();
                        connection = null;
                        GC.Collect();
                        connection = new SqlCeConnection(engine.LocalConnectionString);
                        connection.Open();
                    }
                    i++;
                }
                ThirdList = null;
 
                connection.Close();
                connection.Dispose();
                connection = null;
                engine.Dispose();
                engine = null;
                GC.Collect();               
 
            }
            catch (Exception err)
            {
                АШЫПКААА!!!
            }
        }
после cmd.Parameters.Add стоят правильные значения, здесь приведены для полноты картины.

Добавлено через 3 минуты
Также вопрос актуален, где в Вижуал Студии посмотреть, какие куски кода отжирают много памяти :о)
0
 Аватар для Faba
90 / 88 / 17
Регистрация: 30.10.2009
Сообщений: 562
09.09.2010, 16:06
пользуйтесь тегами для вставки кода. код тяжело читается.
0
0 / 0 / 0
Регистрация: 06.09.2010
Сообщений: 4
09.09.2010, 16:26  [ТС]
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
private void FromListToSql()
{
int i = 0;
try
{
while (FirstList.Count > 0)
{
SqlCeCommand cmd = connection.CreateCommand();
cmd.CommandText =
"insert into FirstTable values(?,?,?)";
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.ExecuteScalar();
cmd = null;
FirstList.RemoveAt(0);
int a = i % 1000;
if (a == 0)
{
connection.Close();
connection.Dispose();
connection = null; 
GC.Collect();
connection = new SqlCeConnection(engine.LocalConnectionString);
connection.Open();
}
 
i++; 
}
FirstList = null;
 
connection.Close();
connection.Dispose();
connection = null;
engine.Dispose();
engine = null;
 
GC.Collect();
 
engine = new SqlCeEngine(blablabla);
connection = new SqlCeConnection(engine.LocalConnectionString);
connection.Open();
 
while (SecondList.Count > 0)
{
SqlCeCommand cmd = connection.CreateCommand();
cmd.CommandText =
"insert into SecondTable values(?,?,?,?,?)";
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.ExecuteScalar();
cmd = null;
SecondList.RemoveAt(0);
int a = i % 1000;
if (a == 0)
{
connection.Close();
connection.Dispose();
connection = null;
GC.Collect();
connection = new SqlCeConnection(engine.LocalConnectionString);
connection.Open();
}
 
i++;
}
SecondList = null;
 
connection.Close();
connection.Dispose();
connection = null;
engine.Dispose();
engine = null;
 
GC.Collect();
 
engine = new SqlCeEngine(blablabla);
connection = new SqlCeConnection(engine.LocalConnectionString);
connection.Open(); 
 
while (ThirdList.Count > 0)
{
SqlCeCommand cmd = connection.CreateCommand();
cmd.CommandText =
"insert into ThirdTable values(?,?,?,?,?,?,?,?)";
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.Parameters.Add
cmd.ExecuteScalar();
cmd = null;
ThirdList.RemoveAt(0);
int a = i % 1000;
if (a == 0)
{
connection.Close();
connection.Dispose();
connection = null;
GC.Collect();
connection = new SqlCeConnection(engine.LocalConnectionString);
connection.Open();
}
i++;
}
ThirdList = null;
 
connection.Close();
connection.Dispose();
connection = null;
engine.Dispose();
engine = null;
GC.Collect(); 
 
}
catch (Exception err)
{
АШЫПКААА!!!
}
}
0
5 / 5 / 4
Регистрация: 06.05.2010
Сообщений: 180
09.09.2010, 22:13
мне в глаза бросилось, что команда создается внутри цикла. это значит, что в памяти будет List.Count объектов команд. команда, по- моему, тяжеловатый объект. Хотя на них никто не ссылается, сборка мусора хитро устроена.

попробуй создать единственную команду за пределами цикла и потом вызывать ее с разными параметрами? И я по-моему пользовался ExecuteNonQuery() а не Scalar().
0
8 / 8 / 1
Регистрация: 20.07.2010
Сообщений: 22
10.09.2010, 11:23
Объявите в основном статическом классе метод:

C#
1
2
[DllImport("kernel32.dll")]
public static extern bool SetProcessWorkingSetSize(IntPtr handle, int minimumWorkingSetSize, int maximumWorkingSetSize);
И при необходимости очистки вызывайте:
C#
1
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
Стандартному сборщику мусора доверять не стоит, пока он не посчитает что куча заполнена и не почешется. А такой грубый способ оказывается весьма действенным, зачастую приложение которое жрет 20-30 метров оперативы начинает занимать память в пределах 500Кб.
0
 Аватар для tasty_sock
139 / 137 / 21
Регистрация: 26.01.2010
Сообщений: 350
10.09.2010, 12:49
Данная функция не спасает. Мне нужно было вывести большое количество записей (больше тысячи), на каждую запись динамически создавались контролы: несколько лейблов, пара текстбоксов и прочее. В итоге было очень много контролов. Естественно, прога вылетала с ошибкой о нехватке памяти. Узнав про эту функцию, я её опробовал. Результата не последовало, даже если вызывать её после создания контролов на одну запись. Вылетает та же самая ошибка.

PS: проблему решил постраничным выводом. 50 записей на страницу.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.09.2010, 12:49
Помогаю со студенческими работами здесь

Экспорт данных в БД MS SQL Server Compact Edition
Здравствуйте, у меня такая проблема. Мне необходимо создать приложение которое использует локальную БД, я выбрал для этого MS SQL...

Как в VS 2010 создать базу данных SQL Server Compact Edition 4.0
В списке есть только версия 3.5, но у меня установлен SQL Server Compact Edition 4-ой версии точно.

Microsoft SQL Server Compact Edition в SQL Server Management Studio Express
Не могу понять как настроить SQL Server Management Studio Expres чтоб открывать и создавать бд sql ce. В менеджере просто нет возможности...

Создать Local DataBase (SQL Server Compact Edition *.sdf) в MS VisualStudio 2015
Раньше в VS было создание Local DataBase, теперь работаю в VS2015 и не могу найти его. Если его нет то чем заменить? Нужна именно локальная...

Базу SQL Server Compact Edition 4.0 нельзя выбрать в качестве источника данных в проекте
Установлен Visual Studio Ultimate 2010 SP1, SQL Server Compact Edition 4.0 и Visual Studio 2010 Tools for SQL Server CE 4.0 тоже. По идее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru