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

Entity Framework проблемы с памятью

11.02.2021, 09:28. Показов 3715. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, Я тут решил разобраться с такой вещью как Entity Framework взял базу sqlite в таблице 1м строк и 263 столбца преимущественно float значения.

Создал контекст
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public class DbTestDataBase : DbContext
    {
 
        public DbTestDataBase():base("ConnectionString")
        {
            
        }
       
 
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
 
        public DbSet<RealTimeDataTable> RealTimeDataTable { get; set; }
 
    }
И сделал следующую манипуляцию
C#
1
2
3
4
5
6
7
8
9
10
11
12
 using (var db = new DbTestDataBase())
                {
                    var lis = db.RealTimeDataTable.Where(e => e.Value52 > 1600867200 && e.Value52 < 1600953600).ToArray();
 
                    foreach (var rr in lis)
                    {
                        var v = rr.Value52;
                        Console.SetCursorPosition(0,0);
                        Console.WriteLine(v);
 
                    }
                }
И в этом примере я запрашиваю 86000 строк это не так много, и я это понимаю но при данном запросе память занимаемая программой уходит за 1.5 гб. Хотя если я сделаю тоже самое с помощью SQLiteDataReader помещу все значения в туже модель таблицы не будет больше 100 мб и то это много можно сократить 20 мб. Вопрос что то я делаю не так или Entity Framework не про это?

Добавлено через 33 секунды
Модель таблицы
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
 [Table("RealTimeDataTable")]
    public class RealTimeDataTable
    {
        
        public int Number { get; set; }
 
         
        public string ShrtFile_Name { get; set; } = string.Empty;
 
        
        public bool Sync { get; set; }
 
        
        public bool Send { get; set; }
        
        public float Value0 { get; set; } = 0;
        
        public float Value1 { get; set; } = 0;
        
        public float Value2 { get; set; } = 0;
        
        public float Value3 { get; set; } = 0;
        
        public float Value4 { get; set; } = 0;
        
        public float Value5 { get; set; } = 0;
        
        public float Value6 { get; set; } = 0;
        
        public float Value7 { get; set; } = 0;
        
        public float Value8 { get; set; } = 0;
        
        public float Value9 { get; set; } = 0;
        
        public float Value10 { get; set; } = 0;
        
        public float Value11 { get; set; } = 0;
        
        public float Value12 { get; set; } = 0;
        
        public float Value13 { get; set; } = 0;
        
        public float Value14 { get; set; } = 0;
        
        public float Value15 { get; set; } = 0;
        
        public float Value16 { get; set; } = 0;
        
        public float Value17 { get; set; } = 0;
        
        public float Value18 { get; set; } = 0;
        
        public float Value19 { get; set; } = 0;
        
        public float Value20 { get; set; } = 0;
        
        public float Value21 { get; set; } = 0;
        
        public float Value22 { get; set; } = 0;
        
        public float Value23 { get; set; } = 0;
        
        public float Value24 { get; set; } = 0;
        
        public float Value25 { get; set; } = 0;
        
        public float Value26 { get; set; } = 0;
        
        public float Value27 { get; set; } = 0;
        
        public float Value28 { get; set; } = 0;
        
        public float Value29 { get; set; } = 0;
        
        public float Value30 { get; set; } = 0;
        
        public float Value31 { get; set; } = 0;
        
        public float Value32 { get; set; } = 0;
        
        public float Value33 { get; set; } = 0;
        
        public float Value34 { get; set; } = 0;
        
        public int Value35 { get; set; } = 0;
        
        public int Value36 { get; set; } = 0;
        
        public float Value37 { get; set; } = 0;
        
        public float Value38 { get; set; } = 0;
        
        public float Value39 { get; set; } = 0;
        
        public float Value40 { get; set; } = 0;
        
        public float Value41 { get; set; } = 0;
        
        public float Value42 { get; set; } = 0;
        
        public float Value43 { get; set; } = 0;
        
        public float Value44 { get; set; } = 0;
        
        public float Value45 { get; set; } = 0;
        
        public float Value46 { get; set; } = 0;
        
        public float Value47 { get; set; } = 0;
        
        public float Value48 { get; set; } = 0;
        
        public float Value49 { get; set; } = 0;
        
        public float Value50 { get; set; } = 0;
        
        public float Value51 { get; set; } = 0;
        
        [Key, Required, DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Value52 { get; set; }
        
        public float Value53 { get; set; } = 0;
        
        public float Value54 { get; set; } = 0;
        
        public float Value55 { get; set; } = 0;
        
        public float Value56 { get; set; } = 0;
        
        public float Value57 { get; set; } = 0;
        
        public float Value58 { get; set; } = 0;
 
        public float Value59 { get; set; } = 0;
 
        public float Value60 { get; set; } = 0;
 
        public float Value61 { get; set; } = 0;
 
        public float Value62 { get; set; } = 0;
 
        public float Value63 { get; set; } = 0;
 
        public float Value64 { get; set; } = 0;
 
        public float Value65 { get; set; } = 0;
 
        public float Value66 { get; set; } = 0;
 
        public float Value67 { get; set; } = 0;
 
        public float Value68 { get; set; } = 0;
 
        public float Value69 { get; set; } = 0;
 
        public float Value70 { get; set; } = 0;
 
        public float Value71 { get; set; } = 0;
 
        public float Value72 { get; set; } = 0;
 
        public short Value73 { get; set; } = 0;
 
        public float Value74 { get; set; } = 0;
 
        public int Value75 { get; set; } = 0;
 
        public float Value76 { get; set; } = 0;
 
        public float Value77 { get; set; } = 0;
 
        public short Value78 { get; set; } = 0;
 
        public float Value79 { get; set; } = 0;
 
        public float Value80 { get; set; } = 0;
 
        public float Value81 { get; set; } = 0;
 
        public float Value82 { get; set; } = 0;
 
        public float Value83 { get; set; } = 0;
 
        public float Value84 { get; set; } = 0;
 
        public float Value85 { get; set; } = 0;
 
        public object Value86 { get; set; } = null;
 
        public float Value87 { get; set; } = 0;
 
        public float Value88 { get; set; } = 0;
 
        public float Value89 { get; set; } = 0;
 
        public float Value90 { get; set; } = 0;
 
        public float Value91 { get; set; } = 0;
 
        public float Value92 { get; set; } = 0;
 
        public float Value93 { get; set; } = 0;
 
        public float Value94 { get; set; } = 0;
 
        public float Value95 { get; set; } = 0;
 
        public float Value96 { get; set; } = 0;
 
        public float Value97 { get; set; } = 0;
 
        public float Value98 { get; set; } = 0;
 
        public float Value99 { get; set; } = 0;
 
        public float Value100 { get; set; } = 0;
 
        public float Value101 { get; set; } = 0;
 
        public float Value102 { get; set; } = 0;
 
        public short Value103 { get; set; } = 0;
 
        public float Value104 { get; set; } = 0;
 
        public float Value105 { get; set; } = 0;
 
        public float Value106 { get; set; } = 0;
 
        public short Value107 { get; set; } = 0;
 
        public short Value108 { get; set; } = 0;
 
        public short Value109 { get; set; } = 0;
 
        public short Value110 { get; set; } = 0;
 
        public short Value111 { get; set; } = 0;
 
        public short Value112 { get; set; } = 0;
 
        public short Value113 { get; set; } = 0;
 
        public float Value114 { get; set; } = 0;
 
        public float Value115 { get; set; } = 0;
 
        public float Value116 { get; set; } = 0;
 
        public float Value117 { get; set; } = 0;
 
        public float Value118 { get; set; } = 0;
 
        public float Value119 { get; set; } = 0;
 
        public float Value120 { get; set; } = 0;
 
        public float Value121 { get; set; } = 0;
 
        public float Value122 { get; set; } = 0;
 
        public float Value123 { get; set; } = 0;
 
        public float Value124 { get; set; } = 0;
 
        public object Value125 { get; set; } = null;
 
        public object Value126 { get; set; } = null;
 
        public float Value127 { get; set; } = 0;
 
        public float Value128 { get; set; } = 0;
 
        public float Value129 { get; set; } = 0;
 
        public float Value130 { get; set; } = 0;
 
        public short Value131 { get; set; } = 0;
 
        public short Value132 { get; set; } = 0;
 
        public float Value133 { get; set; } = 0;
 
        public float Value134 { get; set; } = 0;
 
        public float Value135 { get; set; } = 0;
 
        public float Value136 { get; set; } = 0;
 
        public float Value137 { get; set; } = 0;
 
        public float Value138 { get; set; } = 0;
 
        public float Value139 { get; set; } = 0;
 
        public float Value140 { get; set; } = 0;
 
        public float Value141 { get; set; } = 0;
 
        public float Value142 { get; set; } = 0;
 
        public float Value143 { get; set; } = 0;
 
        public float Value144 { get; set; } = 0;
 
        public float Value145 { get; set; } = 0;
 
        public float Value146 { get; set; } = 0;
 
        public float Value147 { get; set; } = 0;
 
        public object Value148 { get; set; } = null;
 
        public float Value149 { get; set; } = 0;
 
        public short Value150 { get; set; } = 0;
 
        public float Value151 { get; set; } = 0;
 
        public float Value152 { get; set; } = 0;
 
        public float Value153 { get; set; } = 0;
 
        public float Value154 { get; set; } = 0;
 
        public float Value155 { get; set; } = 0;
 
        public float Value156 { get; set; } = 0;
 
        public float Value157 { get; set; } = 0;
 
        public float Value158 { get; set; } = 0;
 
        public float Value159 { get; set; } = 0;
 
        public float Value160 { get; set; } = 0;
 
        public float Value161 { get; set; } = 0;
 
        public float Value162 { get; set; } = 0;
 
        public float Value163 { get; set; } = 0;
 
        public float Value164 { get; set; } = 0;
 
        public float Value165 { get; set; } = 0;
 
        public float Value166 { get; set; } = 0;
 
        public float Value167 { get; set; } = 0;
 
        public float Value168 { get; set; } = 0;
 
        public float Value169 { get; set; } = 0;
 
        public float Value170 { get; set; } = 0;
 
        public float Value171 { get; set; } = 0;
 
        public float Value172 { get; set; } = 0;
 
        public float Value173 { get; set; } = 0;
 
        public float Value174 { get; set; } = 0;
 
        public float Value175 { get; set; } = 0;
 
        public float Value176 { get; set; } = 0;
 
        public float Value177 { get; set; } = 0;
 
        public float Value178 { get; set; } = 0;
 
        public float Value179 { get; set; } = 0;
 
        public float Value180 { get; set; } = 0;
 
        public float Value181 { get; set; } = 0;
 
        public float Value182 { get; set; } = 0;
 
        public float Value183 { get; set; } = 0;
 
        public float Value184 { get; set; } = 0;
 
        public float Value185 { get; set; } = 0;
 
        public float Value186 { get; set; } = 0;
 
        public float Value187 { get; set; } = 0;
 
        public float Value188 { get; set; } = 0;
 
        public float Value189 { get; set; } = 0;
 
        public short Value190 { get; set; } = 0;
 
        public float Value191 { get; set; } = 0;
 
        public float Value192 { get; set; } = 0;
 
        public float Value193 { get; set; } = 0;
 
        public float Value194 { get; set; } = 0;
 
        public float Value195 { get; set; } = 0;
 
        public float Value196 { get; set; } = 0;
 
        public float Value197 { get; set; } = 0;
 
        public float Value198 { get; set; } = 0;
 
        public float Value199 { get; set; } = 0;
 
        public float Value200 { get; set; } = 0;
 
        public float Value201 { get; set; } = 0;
 
        public float Value202 { get; set; } = 0;
 
        public float Value203 { get; set; } = 0;
 
        public float Value204 { get; set; } = 0;
 
        public float Value205 { get; set; } = 0;
 
        public float Value206 { get; set; } = 0;
 
        public float Value207 { get; set; } = 0;
 
        public float Value208 { get; set; } = 0;
 
        public float Value209 { get; set; } = 0;
 
        public float Value210 { get; set; } = 0;
 
        public float Value211 { get; set; } = 0;
 
        public short Value212 { get; set; } = 0;
 
        public int Value213 { get; set; } = 0;
 
        public int Value214 { get; set; } = 0;
 
        public float Value215 { get; set; } = 0;
 
        public float Value216 { get; set; } = 0;
 
        public float Value217 { get; set; } = 0;
 
        public float Value218 { get; set; } = 0;
 
        public float Value219 { get; set; } = 0;
 
        public float Value220 { get; set; } = 0;
 
        public float Value221 { get; set; } = 0;
 
        public float Value222 { get; set; } = 0;
 
        public float Value223 { get; set; } = 0;
 
        public float Value224 { get; set; } = 0;
 
        public float Value225 { get; set; } = 0;
 
        public float Value226 { get; set; } = 0;
 
        public float Value227 { get; set; } = 0;
 
        public float Value228 { get; set; } = 0;
 
        public float Value229 { get; set; } = 0;
 
        public float Value230 { get; set; } = 0;
 
        public float Value231 { get; set; } = 0;
 
        public object Value232 { get; set; } = null;
 
        public int Value233 { get; set; } = 0;
 
        public int Value234 { get; set; } = 0;
 
        public float Value235 { get; set; } = 0;
 
        public float Value236 { get; set; } = 0;
 
        public float Value237 { get; set; } = 0;
 
        public float Value238 { get; set; } = 0;
 
        public float Value239 { get; set; } = 0;
 
        public float Value240 { get; set; } = 0;
 
        public float Value241 { get; set; } = 0;
 
        public float Value242 { get; set; } = 0;
 
        public float Value243 { get; set; } = 0;
 
        public float Value244 { get; set; } = 0;
 
        public float Value245 { get; set; } = 0;
 
        public float Value246 { get; set; } = 0;
 
        public float Value247 { get; set; } = 0;
 
        public float Value248 { get; set; } = 0;
 
        public float Value249 { get; set; } = 0;
 
        public float Value250 { get; set; } = 0;
 
        public float Value251 { get; set; } = 0;
 
        public float Value252 { get; set; } = 0;
 
        public float Value253 { get; set; } = 0;
 
        public object Value254 { get; set; } = null;
 
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2021, 09:28
Ответы с готовыми решениями:

В чем разница между Entity Framework и Entity Framework Core?
В чем разница (если она есть) между entity framework и entity framework core?

Entity Framework. Удаление entity без удаления связей
Вечер добрый. Есть модель Coder First. Каскадное удаление запрещено. Удаление произвожу так: try { ...

Entity Framework 6
Нарисовалась неожиданная проблемка. Штудирую Троелсена, там описание Framework 4, у меня 6-я версия. Один из примеров пришлось...

67
Эксперт .NET
 Аватар для Usaga
14305 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,403
11.02.2021, 09:35
Цитата Сообщение от Graf1385 Посмотреть сообщение
и 263 столбца
Это дичь натуральная. Так никто не делает. Явно ошибка проектирования схемы базы данных.

Цитата Сообщение от Graf1385 Посмотреть сообщение
И в этом примере я запрашиваю 86000 строк это не так много, и я это понимаю но при данном запросе память занимаемая программой уходит за 1.5 гб.
Конечно. Вы же выгребаете ВСЕ поля таблицы, хотя используете только одно - Value52. Плюс к этому, EF создаёт копию (в памяти) каждого объекта, чтобы потом можно было определить что в них изменилось (для механизма Change Tracking). Поэтому памяти уходить сильно больше.

Цитата Сообщение от Graf1385 Посмотреть сообщение
Вопрос что то я делаю не так или Entity Framework не про это?
Конечно же EF виноват в том, что вы его неправильно используете)
2
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
11.02.2021, 10:27
Graf1385, не лень было свойства в классе объявлять ?
1
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
11.02.2021, 11:42  [ТС]
Я понимаю что я делаю всё не так. Это первый опыт с ef в этом и вопрос как правельно проделывать данные операции.
А поповобу того чо ef создаёт копии данных я понял. Моя задача уменьшить потребляемую память и облегчить доступ к данным. Как показала практика у меня не очень получилось. Я не понимаю как мне сдель так чтобы на выхлди был просто массив данных без копий и т. д.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
11.02.2021, 11:47
Цитата Сообщение от Graf1385 Посмотреть сообщение
Как показала практика у меня не очень получилось.
Спроектировать БД - не поле перейти, поэтому начинайте с проекта БД
0
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
11.02.2021, 12:12  [ТС]
А что там проэктировать она нормальная. Тут вопрос не в работоспособности бд эта база в даном виде уже работает 2 года без нариканий. Это отговорка какая-то в примере одна таблица эти даные идут в комлексе разделять их нельзя как что тут проэтировать?
0
Эксперт .NET
 Аватар для Usaga
14305 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,403
11.02.2021, 12:41
Graf1385, таблица с 263 столбцами не есть нормально. Это точно ошибка проектирования. Тут явно должно быть большее количество таблиц, каждая под свои колонки.

Цитата Сообщение от Graf1385 Посмотреть сообщение
Это отговорка какая-то в примере одна таблица эти даные идут в комлексе разделять их нельзя как что тут проэтировать?
В 99% разделить можно и разделить нужно.

Но если прямо по сути вопроса, то нужно использовать проекции:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 using (var db = new DbTestDataBase())
                {
                    var lis = db.RealTimeDataTable
                          .Where(e => e.Value52 > 1600867200 && e.Value52 < 1600953600)
                          .Select(e => e.Value52) // просто берём одно отдельное поле
                          .ToArray();
 
                    // в lis будет массив float'ов
 
                    foreach (var rr in lis)
                    {
                        var v = rr;
                        Console.SetCursorPosition(0,0);
                        Console.WriteLine(v);
 
                    }
                }
Это вытащит только те поля, что нужны. Плюс, EF не отслеживает состояние проекций, поэтому никаких копий в оперативке не будет.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
11.02.2021, 14:45
У меня вопрос к ТС: как он представляет себе работу пользователя с 70 000 записей в гриде, да при том еще 263 столбца ?
Сам факт, что все свалено в единственную таблицу (представляю какой там бардак), говорит о том, то горе-разработчик этой горе-БД тупо содрал ее из какого-нибудь Excel, с которым работала "100 лет в обед" пресловутая Марьиванна
0
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
11.02.2021, 15:17  [ТС]
Давайте подискутируем на эту тему мне очень интересно. Как бы вы разделили данную таблицу? Сразу уточню что значения value0 - value254 это показания определённых приборов а значение value52 это единица времени. То есть одна стока таблицы это собранные показания с приборов за определённую единицу времени. Ещё ни одно значения в таблице не может быть null это очень важно, также кол-во значений должно соответствовать количеству первичного ключа Value52 то есть если не одного приборе нет то запись будет выглядеть так value0-value254 = 0 а value52 = единице времени.

Добавлено через 3 минуты
У меня вопрос к ТС: как он представляет себе работу пользователя с 70 000 записей в гриде, да при том еще 263 столбца ?
Сам факт, что все свалено в единственную таблицу (представляю какой там бардак), говорит о том, то горе-разработчик этой горе-БД тупо содрал ее из какого-нибудь Excel, с которым работала "100 лет в обед" пресловутая Марьиванна
О гриде там речи нет в виде множество кривых данные выводиться и значение 86400 вибронно не спроста.
Но по поводу грида легко представляю VirtualMode = true.

Добавлено через 16 минут
Сам факт, что все свалено в единственную таблицу (представляю какой там бардак), говорит о том, то горе-разработчик этой горе-БД тупо содрал ее из какого-нибудь Excel, с которым работала "100 лет в обед" пресловутая Марьиванна
Нравятся мене люди которые не представляют о чём речь но оценку чужой работе дают охотно.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
11.02.2021, 15:20
Цитата Сообщение от Graf1385 Посмотреть сообщение
Сразу уточню что значения value0 - value254
Сразу отвечу - одна таблица для приборов. Вторая- для их показаний (время, показания).
Причем вторая содержит все возможные виды показаний: но заполняются только те поля, которые нужны для данного прибора. Например, есть два датчика: температуры и высоты. Оба датчика в 1-й таблице, во второй 4 поля: 2 с id (собственный и парентский id датчика), поле тепературы и поле высоты. Для первого датчика значение только в поле температуры, в поле выстоты null, для второго - наоборот.

Если нужно вывести кросс-таблицу (pivot) с пресловутыми 268 колонками, то это делается соответствующим запросом. И для этого совершенно не нужна безобразная монстроидальная таблица в БД, грузящая и сервер и приложение.
Цитата Сообщение от Graf1385 Посмотреть сообщение
О гриде там речи нет в виде множество кривых данные выводиться и значение 86400 вибронно не спроста.
Но по поводу грида легко представляю VirtualMode = true.
Какое отношение все это имеет к уродству Вашей БД ?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
11.02.2021, 15:25
Цитата Сообщение от Graf1385 Посмотреть сообщение
Сразу уточню что значения value0 - value254 это показания определённых приборов
Каждый прибор должен иметь свой идентификатор, выше уже сказали как делать.
Цитата Сообщение от Graf1385 Посмотреть сообщение
О гриде там речи нет в виде множество кривых данные выводиться и значение 86400 вибронно не спроста.
Ага, типо данные посуточно , тут гением не нужно быть, тут нужно быть:
Цитата Сообщение от Graf1385 Посмотреть сообщение
люди которые не представляют о чём речь
0
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
11.02.2021, 15:58  [ТС]
Цитата Сообщение от MsGuns Посмотреть сообщение
Сразу отвечу - одна таблица для приборов. Вторая- для их показаний (время, показания).
Причем вторая содержит все возможные виды показаний: но заполняются только те поля, которые нужны для данного прибора. Например, есть два датчика: температуры и высоты. Оба датчика в 1-й таблице, во второй 4 поля: 2 с id (собственный и парентский id датчика), поле тепературы и поле высоты. Для первого датчика значение только в поле температуры, в поле выстоты null, для второго - наоборот.
Вот именно так всё и сделано в это бд. RealTimeDataTable это таблица показаний датчиков где название поля value а номер это id прибора всего приборов-датчиков 255. Названия датчиков, адрес к данным, тип данных, флаг брать ли с данного датчика показания, всё это в отдельной таблице даже больше скажу в отдельной базе данных.

Добавлено через 2 минуты
Ага, типо данные посуточно , тут гением не нужно быть, тут нужно быть:
Так потому что не надо быть гением я это не объяснял, зачем объяснять элементарные вещи, но я смотрю вы на этой цифре заострили внимание гуглили наверно.

Добавлено через 5 минут
Цитата Сообщение от Почтальон Посмотреть сообщение
люди которые не представляют о чём речь
Это про то что как можно давать оценку базе данных и как она спроектирована если вы видели всего одну таблицу и даже не представляете для чего она была создана и в таком виде. Это по меньшей мере не профессионально.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
11.02.2021, 16:06
Цитата Сообщение от Graf1385 Посмотреть сообщение
Вот именно так всё и сделано в это бд. RealTimeDataTable это таблица показаний датчиков где название поля value а номер это id прибора всего приборов-датчиков 255. Названия датчиков, адрес к данным, тип данных, флаг брать ли с данного датчика показания, всё это в отдельной таблице даже больше скажу в отдельной базе данных.
Для реляционной СУБД и EF вам достаточно таблицы с 4 полями: Id (PK), SensorId (FK), Timestamp (DATETIME), Value (INT).
А есть еще нереляционные СУБД...
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
11.02.2021, 16:13
Цитата Сообщение от Graf1385 Посмотреть сообщение
я смотрю вы на этой цифре заострили внимание гуглили наверно
Это уже что-то своего рода константы, гуглить даже не нужно, это первое что приходит на ум
0
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
11.02.2021, 16:26  [ТС]
Цитата Сообщение от Cupko Посмотреть сообщение
Для реляционной СУБД и EF вам достаточно таблицы с 4 полями: Id (PK), SensorId (FK), Timestamp (DATETIME), Value (INT).
То есть вы предлагаете создать таблицу в которой каждая строка это отдельный датчик. То есть сейчас у меня опрос идёт каждую секунду, раз в секунду я создаю 1 строку с 255 параметрами. Вы это хотите заменить на 255 строк. Одна таблица хранит данные за полгода 15 миллионов строк умножить на 255 не перебор. При том что мне при любой выборке всегда нужно все 255 значений. И мне не нужно их id так как названия поля и есть id датчика 0-254. value0, value1, ...... value254 цифра и есть id. Как может мне помочь данное разделение если ни в одном запросе id прибора не будет использоваться а будет использоваться только время. К этой таблице был написан всего одни запрос SELECT * FROM RealTimeDataTable WHERE Value52 >= @start AND Value52 <= @end всё и это принципиально нет других вариантов можно ещё добавить в конце сортировку ASC/

Добавлено через 1 минуту
Цитата Сообщение от Почтальон Посмотреть сообщение
Это уже что-то своего рода константы, гуглить даже не нужно, это первое что приходит на ум
Вот тогда зачем было заострят на этом внимание.
0
 Аватар для Cupko
658 / 595 / 171
Регистрация: 17.07.2012
Сообщений: 1,682
Записей в блоге: 1
11.02.2021, 16:46
Цитата Сообщение от Graf1385 Посмотреть сообщение
То есть вы предлагаете создать таблицу в которой каждая строка это отдельный датчик. То есть сейчас у меня опрос идёт каждую секунду, раз в секунду я создаю 1 строку с 255 параметрами. Вы это хотите заменить на 255 строк. Одна таблица хранит данные за полгода 15 миллионов строк умножить на 255 не перебор. При том что мне при любой выборке всегда нужно все 255 значений и мне не нужно их id так как названия поля и есть id датчика 0-254. value0, value1, ...... value254 цифра и есть id как может мне помочь данное разделение если ни в одном запросе id прибора не будет использоваться а будет использоваться только время. к этой таблице был написана всего одни запрос SELECT * FROM RealTimeDataTable WHERE Value52 >= @start AND Value52 <= @end всё и это принципиально нет других вариантов можно ещё добавить в конце сортировку ASC/
Я предлагаю сделать правильно с точки зрения проектирования БД. Не более того. Вариантов множество. Вы можете хранить их в какой-нибудь JSON-нине, если у вас по ним поиска и джоинов нет. Можете NoSQL СУБД для этого использовать. Вам точно не нужно хранить дефолтное значение, ибо оно тянется со всей этой массой. Вам точно не нужно использовать EF, а брать что-то легковесное типа Dapper'а, или вообще чистый ADO.NET. Есть специальные хранилища и механизмы работы с BigData, хотя они тут вам вряд ли нужны. Есть специальные технологии разбивки таблиц по разным файлам, если вам не нужны данные за долгое время. И 3 миллиарда записей для базы данных - это не так ужасно, как вы думаете.

Добавлено через 10 минут
Для EF начните с AsNoTracking(), хотя, повторюсь, он тут нафиг не нужон
C#
1
var lis = db.RealTimeDataTable.AsNoTracking().Where(e => e.Value52 > 1600867200 && e.Value52 < 1600953600).ToArray();
1
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
11.02.2021, 16:56  [ТС]
Цитата Сообщение от Cupko Посмотреть сообщение
И 3 миллиарда записей для базы данных - это не так ужасно, как вы думаете.
Нет конечно не ужасно если есть необходимость но я бы разделил на разные файлы напри мер по месяцам если как у меня привязка ко времени. Дела даже не в количестве строк в структуре таблицы есть два ненужных поля Id (PK), SensorId (FK),
плюс Timestamp (DATETIME) будет повторяться 255 раз одно и тоже значения. Это же расходование памяти в пустую.

Добавлено через 3 минуты
Для EF начните с AsNoTracking(), хотя, повторюсь, он тут нафиг не нужон
Я попробую, это был всего эксперимент приложение уже работает без сбоев очень долго. Просто нет предела к совершенству.
0
Эксперт .NET
 Аватар для Usaga
14305 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,403
11.02.2021, 17:04
Цитата Сообщение от Graf1385 Посмотреть сообщение
Я попробую, это был всего эксперимент приложение уже работает без сбоев очень долго. Просто нет предела к совершенству.
Показанный в первом посте код совершенством не блещет. Работа с СУБД очень неоптимальным образов ведётся.
0
0 / 0 / 5
Регистрация: 09.10.2015
Сообщений: 229
11.02.2021, 17:19  [ТС]
Показанный в первом посте код совершенством не блещет. Работа с СУБД очень неоптимальным образов ведётся.
Поконкретнее.
0
Эксперт .NET
 Аватар для Usaga
14305 / 9389 / 1355
Регистрация: 21.01.2016
Сообщений: 35,403
11.02.2021, 17:24
Graf1385, вы мои посты вообще не читали?) Там даже пример есть кода...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2021, 17:24
Помогаю со студенческими работами здесь

Entity Framework

Entity framework One vs Zero-or-One
При настройке ассоциаций между двумя сущностями можно выбрать чтобы на конце связь была &quot;один&quot; и &quot;ноль или один&quot;-не...

Entity Framework
Здравствуйте, пока только начал работать с C# WPF и EF. Возникла такая проблема, я создал базу в MS Sql. Создал модель EF по готовой базе...

Проблемы с Entity framework
Не создается таблица. Прописываю миграцию, нормально, после этого update - пишет что cannot find the object because it does not exist...

Entity Framework Core проблемы подключения
Доброго времени суток. При подключении пакетов EFCore.SQLServer и EFCore.Tools как через NuGet так и через консоль возникает ошибка...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru