-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
2321 lines (2060 loc) · 207 KB
/
index.html
File metadata and controls
2321 lines (2060 loc) · 207 KB
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
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1.0"><!-- Page Metadata --><link rel="canonical" href="https://disnana.github.io/DictSQLite-Release-Note/"><meta name="description" content="DictSQLiteの公式リリースノートです!"><!-- OpenGraph Tags --><meta property="og:title" content="DictSQLite"><meta property="og:type" content="website"><meta property="og:url" content="https://disnana.github.io/DictSQLite-Release-Note/"><meta property="og:locale" content="en"><meta property="og:description" content="DictSQLiteの公式リリースノートです!"><meta property="og:site_name" content="DictSQLite"><!-- Twitter Tags --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:site"><meta name="twitter:title" content="DictSQLite"><meta name="twitter:description" content="DictSQLiteの公式リリースノートです!"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Lato:wght@400;700&family=Source+Code+Pro&display=swap" rel="stylesheet"><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/DictSQLite-Release-Note/assets/ClientRouter.astro_astro_type_script_index_0_lang.QW52Ox2j.js"></script><style>time[data-astro-cid-baakmyjh]{display:block}@keyframes astroFadeInOut{0%{opacity:1}to{opacity:0}}@keyframes astroFadeIn{0%{opacity:0;mix-blend-mode:plus-lighter}to{opacity:1;mix-blend-mode:plus-lighter}}@keyframes astroFadeOut{0%{opacity:1;mix-blend-mode:plus-lighter}to{opacity:0;mix-blend-mode:plus-lighter}}@keyframes astroSlideFromRight{0%{transform:translate(100%)}}@keyframes astroSlideFromLeft{0%{transform:translate(-100%)}}@keyframes astroSlideToRight{to{transform:translate(100%)}}@keyframes astroSlideToLeft{to{transform:translate(-100%)}}@media (prefers-reduced-motion){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}[data-astro-transition-scope]{animation:none!important}}
</style>
<link rel="stylesheet" href="/DictSQLite-Release-Note/assets/index.WEhioEny.css"><style>[data-astro-transition-scope="astro-4xnpz4kg-1"] { view-transition-name: post; }@layer astro { ::view-transition-old(post) {
animation-duration: 180ms;
animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
animation-fill-mode: both;
animation-name: astroFadeOut; }::view-transition-new(post) {
animation-duration: 180ms;
animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
animation-fill-mode: both;
animation-name: astroFadeIn; }[data-astro-transition=back]::view-transition-old(post) {
animation-duration: 180ms;
animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
animation-fill-mode: both;
animation-name: astroFadeOut; }[data-astro-transition=back]::view-transition-new(post) {
animation-duration: 180ms;
animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
animation-fill-mode: both;
animation-name: astroFadeIn; } }[data-astro-transition-fallback="old"] [data-astro-transition-scope="astro-4xnpz4kg-1"],
[data-astro-transition-fallback="old"][data-astro-transition-scope="astro-4xnpz4kg-1"] {
animation-duration: 180ms;
animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
animation-fill-mode: both;
animation-name: astroFadeOut; }[data-astro-transition-fallback="new"] [data-astro-transition-scope="astro-4xnpz4kg-1"],
[data-astro-transition-fallback="new"][data-astro-transition-scope="astro-4xnpz4kg-1"] {
animation-duration: 180ms;
animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
animation-fill-mode: both;
animation-name: astroFadeIn; }[data-astro-transition=back][data-astro-transition-fallback="old"] [data-astro-transition-scope="astro-4xnpz4kg-1"],
[data-astro-transition=back][data-astro-transition-fallback="old"][data-astro-transition-scope="astro-4xnpz4kg-1"] {
animation-duration: 180ms;
animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
animation-fill-mode: both;
animation-name: astroFadeOut; }[data-astro-transition=back][data-astro-transition-fallback="new"] [data-astro-transition-scope="astro-4xnpz4kg-1"],
[data-astro-transition=back][data-astro-transition-fallback="new"][data-astro-transition-scope="astro-4xnpz4kg-1"] {
animation-duration: 180ms;
animation-timing-function: cubic-bezier(0.76, 0, 0.24, 1);
animation-fill-mode: both;
animation-name: astroFadeIn; }</style></head> <body> <div class="glow"></div> <header data-astro-cid-3ef6ksr2> <nav data-astro-cid-3ef6ksr2> <h2 id="site_title" data-astro-cid-3ef6ksr2> <a href="/" data-astro-cid-3ef6ksr2> <svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" data-astro-cid-3ef6ksr2><path fill="url(#a)" fill-rule="evenodd" d="M.654 3.276C0 4.56 0 6.24 0 9.6v4.8c0 3.36 0 5.04.654 6.324a6 6 0 0 0 2.622 2.622C4.56 24 6.24 24 9.6 24h4.8c3.36 0 5.04 0 6.324-.654a6 6 0 0 0 2.622-2.622C24 19.44 24 17.76 24 14.4V9.6c0-3.36 0-5.04-.654-6.324A6 6 0 0 0 20.724.654C19.44 0 17.76 0 14.4 0H9.6C6.24 0 4.56 0 3.276.654A6 6 0 0 0 .654 3.276Zm10.875 16.41a.5.5 0 0 0 .942 0l.628-1.754a8 8 0 0 1 4.833-4.833l1.754-.628a.5.5 0 0 0 0-.942l-1.754-.628A8 8 0 0 1 13.1 6.068l-.628-1.754a.5.5 0 0 0-.942 0l-.628 1.754A8 8 0 0 1 6.068 10.9l-1.754.628a.5.5 0 0 0 0 .942l1.754.628a8 8 0 0 1 4.833 4.833l.628 1.754Z" clip-rule="evenodd" data-astro-cid-3ef6ksr2></path><path stroke="url(#b)" stroke-opacity=".5" stroke-width=".5" d="M.25 9.6c0-1.684 0-2.932.08-3.92.081-.985.24-1.69.547-2.29A5.75 5.75 0 0 1 3.39.877C3.99.57 4.695.41 5.68.33 6.668.25 7.916.25 9.6.25h4.8c1.684 0 2.932 0 3.92.08.985.081 1.69.24 2.29.547a5.75 5.75 0 0 1 2.513 2.513c.306.6.466 1.305.546 2.29.08.988.081 2.236.081 3.92v4.8c0 1.684 0 2.932-.08 3.92-.081.985-.24 1.69-.547 2.29a5.75 5.75 0 0 1-2.513 2.513c-.6.306-1.305.466-2.29.546-.988.08-2.236.081-3.92.081H9.6c-1.684 0-2.932 0-3.92-.08-.985-.081-1.69-.24-2.29-.547A5.75 5.75 0 0 1 .877 20.61C.57 20.01.41 19.305.33 18.32.25 17.332.25 16.084.25 14.4V9.6Zm11.044 10.17c.237.663 1.175.663 1.412 0l.628-1.753a7.75 7.75 0 0 1 4.683-4.683l1.753-.628c.663-.237.663-1.175 0-1.412l-1.753-.628a7.75 7.75 0 0 1-4.683-4.683l-.628-1.753c-.237-.663-1.175-.663-1.412 0l-.628 1.753a7.75 7.75 0 0 1-4.683 4.683l-1.753.628c-.663.237-.663 1.175 0 1.412l1.753.628a7.75 7.75 0 0 1 4.683 4.683l.628 1.753Z" data-astro-cid-3ef6ksr2></path><defs data-astro-cid-3ef6ksr2><radialGradient id="a" cx="0" cy="0" r="1" gradientTransform="rotate(-40.136 32.164 11.75) scale(33.3542)" gradientUnits="userSpaceOnUse" data-astro-cid-3ef6ksr2><stop offset=".639" stop-color="#9818E7" data-astro-cid-3ef6ksr2></stop><stop offset="1" stop-color="#DF7F4F" data-astro-cid-3ef6ksr2></stop></radialGradient><linearGradient id="b" x1="12" x2="12" y1="0" y2="24" gradientUnits="userSpaceOnUse" data-astro-cid-3ef6ksr2><stop stop-color="#fff" data-astro-cid-3ef6ksr2></stop><stop offset="1" stop-color="#fff" stop-opacity="0" data-astro-cid-3ef6ksr2></stop></linearGradient></defs></svg> DictSQLite </a> </h2> <div class="links" data-astro-cid-3ef6ksr2> <a href="mailto:support@disnana.com" data-astro-cid-3ef6ksr2>お問い合わせ</a> </div> </nav> </header> <main> <h1 class="page_title">更新履歴</h1> <hr> <ul class="posts" data-astro-transition-scope="astro-4xnpz4kg-1"> <li class="post"> <div class="version_wrapper"> <div class="version_info"> <a href="/releases/v207"> <div class="version_number">2.0.7</div> <time datetime="2025-12-07T00:00:00.000Z" class="date astro-baakmyjh" data-astro-cid-baakmyjh> Dec 7, 2025 </time> </a> </div> </div> <div class="content"> <h1 id="dictsqlite-v207">DictSQLite v2.0.7</h1>
<p><strong>リリース日</strong>: 2025年12月7日<br>
<strong>タイプ</strong>: パッチリリース</p>
<h2 id="-依存関係の更新">🔧 依存関係の更新</h2>
<h3 id="主要なアップグレード">主要なアップグレード</h3>
<p>最新の依存関係を採用し、セキュリティと性能の向上を実現しました。</p>
<table><thead><tr><th>パッケージ</th><th>v2.0.6</th><th>v2.0.7</th></tr></thead><tbody><tr><td>pyo3</td><td>0.26</td><td>0.27.2</td></tr><tr><td>dashmap</td><td>6.0</td><td>6.1</td></tr><tr><td>tokio</td><td>1.40</td><td>1.42</td></tr><tr><td>pythonize</td><td>0.26</td><td>0.27</td></tr></tbody></table>
<h3 id="主要な改善点">主要な改善点</h3>
<p><strong>pyo3 0.27.2</strong>:</p>
<ul>
<li>FromPyObjectのパフォーマンス改善</li>
<li>より効率的なPython-Rust間のデータ変換</li>
<li>メモリ管理の最適化</li>
</ul>
<p><strong>dashmap 6.1</strong>:</p>
<ul>
<li>ロックフリーなHashMapの性能向上</li>
<li>並行アクセス時の競合削減</li>
</ul>
<p><strong>tokio 1.42</strong>:</p>
<ul>
<li>非同期ランタイムの安定性向上</li>
<li>タスクスケジューリングの改善</li>
</ul>
<h2 id="-パフォーマンス">📊 パフォーマンス</h2>
<p>v2.0.6のパフォーマンス特性を維持しつつ、以下の点で向上:</p>
<ul>
<li>Python-Rust間の変換がさらに高速化</li>
<li>並行処理の安定性向上</li>
<li>非同期処理のレイテンシ改善</li>
</ul>
<p>主要なベンチマーク結果(Lazy mode):</p>
<ul>
<li>書き込み: 154,000+ ops/sec</li>
<li>読み込み: 298,000+ ops/sec</li>
<li>混合操作: 285,000+ ops/sec</li>
</ul>
<h2 id="-バグ修正">🐛 バグ修正</h2>
<h3 id="テストの安定性向上">テストの安定性向上</h3>
<ul>
<li>pytest-v6用のテスト修正を追加</li>
<li>ベンチマークテストの改善</li>
<li>インポートエラーの修正</li>
</ul>
<h3 id="ドキュメントの更新">ドキュメントの更新</h3>
<ul>
<li>マイグレーションガイドの充実</li>
<li>使用例の追加</li>
<li>APIドキュメントの改善</li>
</ul>
<h2 id="-ドキュメント拡充">📝 ドキュメント拡充</h2>
<h3 id="新規ドキュメント">新規ドキュメント</h3>
<ul>
<li><code>MIGRATION_FROM_1.8.8_EN.md</code>: v1.8.8からの移行ガイド</li>
<li><code>EXAMPLES_EN.md</code> / <code>EXAMPLES_JP.md</code>: 詳細な使用例</li>
<li><code>INDEX.md</code>: ドキュメントインデックス</li>
</ul>
<h3 id="移行ガイドの改善">移行ガイドの改善</h3>
<p>v1.8.8からv2.0.7への移行手順を詳細に解説:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># v1.8.8</span></span>
<span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> DictSQLite</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">db[</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> 'value'</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># v2.0.7(同じコードで動作)</span></span>
<span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> DictSQLite</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">db[</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> 'value'</span></span></code></pre>
<h2 id="-セキュリティ">🔒 セキュリティ</h2>
<p>v2.0.4で実装されたセキュリティ機能を維持:</p>
<ul>
<li>✅ AES-256-GCM暗号化</li>
<li>✅ PBKDF2鍵導出</li>
<li>✅ Safe Pickle検証</li>
<li>✅ SQLインジェクション対策</li>
<li>✅ 最新の依存関係(脆弱性なし)</li>
</ul>
<h2 id="-互換性">📖 互換性</h2>
<ul>
<li>Python 3.9以上(Python 3.13対応)</li>
<li>v2.0.0~v2.0.6との完全な互換性を維持</li>
<li>既存のコードは変更不要</li>
</ul>
<h2 id="-使用方法">🚀 使用方法</h2>
<h3 id="インストール">インストール</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">pip</span><span style="color:#9ECBFF"> install</span><span style="color:#79B8FF"> --upgrade</span><span style="color:#9ECBFF"> dictsqlite</span></span></code></pre>
<h3 id="基本的な使用">基本的な使用</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> DictSQLite</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 通常の使用</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">db[</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> 'value'</span></span>
<span class="line"><span style="color:#79B8FF">print</span><span style="color:#E1E4E8">(db[</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">]) </span><span style="color:#6A737D"># 'value'</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># Lazy mode(推奨)</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">persist_mode</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">'lazy'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#F97583">for</span><span style="color:#E1E4E8"> i </span><span style="color:#F97583">in</span><span style="color:#79B8FF"> range</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">10000</span><span style="color:#E1E4E8">):</span></span>
<span class="line"><span style="color:#E1E4E8"> db[</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">'key_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#F97583"> f</span><span style="color:#9ECBFF">'value_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span></span>
<span class="line"><span style="color:#E1E4E8">db.flush() </span><span style="color:#6A737D"># 永続化</span></span></code></pre>
<h3 id="非同期処理">非同期処理</h3>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#F97583">import</span><span style="color:#E1E4E8"> asyncio</span></span>
<span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> AsyncDictSQLite</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">async</span><span style="color:#F97583"> def</span><span style="color:#B392F0"> main</span><span style="color:#E1E4E8">():</span></span>
<span class="line"><span style="color:#F97583"> async</span><span style="color:#F97583"> with</span><span style="color:#E1E4E8"> AsyncDictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">as</span><span style="color:#E1E4E8"> db:</span></span>
<span class="line"><span style="color:#F97583"> await</span><span style="color:#E1E4E8"> db.aset(</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">'value'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8"> value </span><span style="color:#F97583">=</span><span style="color:#F97583"> await</span><span style="color:#E1E4E8"> db.aget(</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#79B8FF"> print</span><span style="color:#E1E4E8">(value) </span><span style="color:#6A737D"># 'value'</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">asyncio.run(main())</span></span></code></pre>
<h2 id="-リリースサイクル">📈 リリースサイクル</h2>
<p>v2.0.7は安定性と依存関係の更新に注力したパッチリリースです。今後も定期的に:</p>
<ul>
<li>セキュリティパッチの適用</li>
<li>依存関係の更新</li>
<li>パフォーマンスの改善</li>
</ul>
<p>を継続していきます。</p>
<h2 id="-推奨事項">🎯 推奨事項</h2>
<p>v2.0.6以前をお使いの場合は、最新の依存関係とバグ修正が含まれるv2.0.7へのアップグレードを推奨します。</p>
<h2 id="-関連リソース">📚 関連リソース</h2>
<ul>
<li><a href="https://github.com/disnana/DictSQLite">GitHub Repository</a></li>
<li><a href="https://pypi.org/project/dictsqlite/">PyPI Package</a></li>
<li><a href="https://github.com/disnana/DictSQLite/tree/main/documents">Documentation</a></li>
<li><a href="https://github.com/disnana/DictSQLite/blob/main/dictsqlite_v2/dictsqlite/docs/MIGRATION_FROM_1.8.8_EN.md">Migration Guide</a></li>
</ul> </div> </li><li class="post"> <div class="version_wrapper"> <div class="version_info"> <a href="/releases/v206"> <div class="version_number">2.0.6</div> <time datetime="2025-12-06T00:00:00.000Z" class="date astro-baakmyjh" data-astro-cid-baakmyjh> Dec 6, 2025 </time> </a> </div> </div> <div class="content"> <h1 id="dictsqlite-v206">DictSQLite v2.0.6</h1>
<p><strong>リリース日</strong>: 2025年12月6日<br>
<strong>タイプ</strong>: マイナーリリース</p>
<h2 id="-主要な成果">🎯 主要な成果</h2>
<p>DictSQLite v2がfastest版を総合性能で上回ることに成功しました。</p>
<h3 id="パフォーマンス比較2000アイテム">パフォーマンス比較(2000アイテム)</h3>
<table><thead><tr><th>テスト</th><th>v2 (Lazy)</th><th>fastest</th><th>勝者</th><th>倍率</th></tr></thead><tbody><tr><td><strong>読み込み</strong></td><td>510,256</td><td>60,579</td><td><strong>v2</strong></td><td><strong>8.42倍</strong> 🏆</td></tr><tr><td><strong>混合操作</strong></td><td>285,657</td><td>210,257</td><td><strong>v2</strong></td><td><strong>1.36倍</strong> 🏆</td></tr><tr><td><strong>総合平均</strong></td><td>246,253</td><td>188,305</td><td><strong>v2</strong></td><td><strong>1.31倍</strong> 🏆</td></tr><tr><td>書き込み</td><td>154,225</td><td>294,079</td><td>fastest</td><td>1.90倍</td></tr></tbody></table>
<h2 id="-最適化内容">🚀 最適化内容</h2>
<h3 id="1-lru追跡の最適化">1. LRU追跡の最適化</h3>
<p>Memory/LazyモードではLRU追跡を完全にスキップし、WriteThroughモードまたはキャパシティ超過時のみ有効化:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="rust"><code><span class="line"><span style="color:#F97583">let</span><span style="color:#E1E4E8"> needs_lru </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> self</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">config</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">persist_mode </span><span style="color:#F97583">==</span><span style="color:#B392F0"> PersistMode</span><span style="color:#F97583">::</span><span style="color:#B392F0">WriteThrough</span><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#F97583"> ||</span><span style="color:#E1E4E8"> current_size </span><span style="color:#F97583">></span><span style="color:#79B8FF"> self</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">config</span><span style="color:#F97583">.</span><span style="color:#E1E4E8">hot_tier_capacity;</span></span></code></pre>
<p><strong>効果</strong>:</p>
<ul>
<li>Mutex lock回数の大幅削減</li>
<li>書き込み性能が35K → 154K ops/sec(4.4倍改善)</li>
</ul>
<h3 id="2-バルク挿入の最適化">2. バルク挿入の最適化</h3>
<p>単一トランザクションでバッチ書き込みを実行:</p>
<ul>
<li><code>flush_write_buffer()</code>: バッファをバルク挿入</li>
<li><code>flush()</code>: LazyモードでBulk Insertを使用</li>
<li><code>evict_warm_tier()</code>: エビクション時にバルク挿入</li>
</ul>
<p><strong>効果</strong>:</p>
<ul>
<li>トランザクションオーバーヘッドの削減</li>
<li>I/O効率の向上</li>
</ul>
<h3 id="3-データクローンの削減">3. データクローンの削減</h3>
<p>Lazyモードではデータクローンを回避:</p>
<p><strong>効果</strong>:</p>
<ul>
<li>メモリ割り当ての削減</li>
<li>CPU使用率の低下</li>
</ul>
<h3 id="4-エビクション閾値の調整">4. エビクション閾値の調整</h3>
<p>エビクション閾値を100%から110%に変更:</p>
<p><strong>効果</strong>:</p>
<ul>
<li>エビクションチェックの頻度削減</li>
<li>オーバーヘッドの低減</li>
</ul>
<h2 id="-モード別性能">📊 モード別性能</h2>
<h3 id="lazy-mode推奨">Lazy Mode(推奨) ⭐</h3>
<ul>
<li><strong>書き込み</strong>: 154,225 ops/sec ⭐ 最高</li>
<li><strong>読み込み</strong>: 298,878 ops/sec</li>
<li><strong>混合</strong>: 285,657 ops/sec ⭐ 最高</li>
<li><strong>総合平均</strong>: 246,253 ops/sec ⭐ 最高</li>
<li><strong>用途</strong>: 一般的な用途、バッチ処理</li>
</ul>
<h3 id="writethrough-mode">WriteThrough Mode</h3>
<ul>
<li><strong>書き込み</strong>: 25,452 ops/sec</li>
<li><strong>読み込み</strong>: 510,256 ops/sec ⭐ 最高</li>
<li><strong>混合</strong>: 25,869 ops/sec</li>
<li><strong>総合平均</strong>: 187,192 ops/sec</li>
<li><strong>用途</strong>: 即時永続化が必要な重要データ</li>
</ul>
<h3 id="memory-mode">Memory Mode</h3>
<ul>
<li><strong>書き込み</strong>: 154,421 ops/sec</li>
<li><strong>読み込み</strong>: 292,347 ops/sec</li>
<li><strong>混合</strong>: 280,837 ops/sec</li>
<li><strong>総合平均</strong>: 242,535 ops/sec</li>
<li><strong>用途</strong>: キャッシュ、セッションデータ</li>
</ul>
<h2 id="-コネクションプール">🔧 コネクションプール</h2>
<p>既に実装済みのコネクションプールを活用:</p>
<ul>
<li>デフォルトpool_size: 20(またはmax(10, CPU cores × 2))</li>
<li>並列読み取り操作のサポート</li>
<li>適切なコネクション管理</li>
</ul>
<h2 id="-性能改善の経緯">📈 性能改善の経緯</h2>
<table><thead><tr><th>段階</th><th>書き込み ops/sec</th><th>改善率</th></tr></thead><tbody><tr><td>初期ベースライン</td><td>28,513</td><td>-</td></tr><tr><td>bulk_insert + LRU 90%</td><td>35,626</td><td>+25%</td></tr><tr><td><strong>LRU完全スキップ</strong></td><td><strong>154,225</strong></td><td><strong>+441%</strong> 🚀</td></tr></tbody></table>
<h2 id="-v2-vs-fastest-の特徴比較">🎯 v2 vs fastest の特徴比較</h2>
<h3 id="v2の優位性">v2の優位性</h3>
<ul>
<li>✅ 8.42倍速い読み込み性能</li>
<li>✅ 1.36倍速い混合操作</li>
<li>✅ 1.31倍速い総合性能</li>
<li>✅ 暗号化サポート(AES-256-GCM)</li>
<li>✅ Safe Pickle検証</li>
<li>✅ 複数の永続化モード</li>
<li>✅ セキュリティ機能完備</li>
</ul>
<h3 id="fastestの特徴">fastestの特徴</h3>
<ul>
<li>⚠️ 1.90倍速い純粋書き込み</li>
<li>⚠️ セキュリティ機能なし</li>
<li>⚠️ 単一モードのみ</li>
</ul>
<h2 id="-使用推奨">📖 使用推奨</h2>
<h3 id="v2を推奨するケース大多数">v2を推奨するケース(大多数)</h3>
<ul>
<li>読み込み中心のワークロード</li>
<li>読み書き混合のワークロード</li>
<li>総合的な高性能が必要な場合</li>
<li>暗号化が必要な場合</li>
<li>Safe Pickle検証が必要な場合</li>
<li>複数の永続化モードが必要な場合</li>
</ul>
<h3 id="fastestを推奨するケース限定的">fastestを推奨するケース(限定的)</h3>
<ul>
<li>純粋な書き込み専用バッチ処理</li>
<li>セキュリティ機能が不要な場合</li>
<li>シンプルさ最優先の場合</li>
</ul>
<h2 id="-使用方法">📝 使用方法</h2>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> DictSQLite</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># Lazy mode(推奨)</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">persist_mode</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">'lazy'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 高速な書き込み</span></span>
<span class="line"><span style="color:#F97583">for</span><span style="color:#E1E4E8"> i </span><span style="color:#F97583">in</span><span style="color:#79B8FF"> range</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">10000</span><span style="color:#E1E4E8">):</span></span>
<span class="line"><span style="color:#E1E4E8"> db[</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">'key_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#F97583"> f</span><span style="color:#9ECBFF">'value_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 高速な読み込み</span></span>
<span class="line"><span style="color:#F97583">for</span><span style="color:#E1E4E8"> i </span><span style="color:#F97583">in</span><span style="color:#79B8FF"> range</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">10000</span><span style="color:#E1E4E8">):</span></span>
<span class="line"><span style="color:#E1E4E8"> value </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> db[</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">'key_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span><span style="color:#E1E4E8">]</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># flush()で永続化</span></span>
<span class="line"><span style="color:#E1E4E8">db.flush()</span></span></code></pre>
<h2 id="-互換性">📖 互換性</h2>
<ul>
<li>Python 3.9以上</li>
<li>v2.0.0~v2.0.5との完全な互換性を維持</li>
</ul>
<h2 id="-結論">🏆 結論</h2>
<p>v2.0.6は、fastest版を総合性能で上回り、セキュリティ機能も完備した最高のリリースです。ほとんどのユースケースでv2.0.6の使用を推奨します。</p> </div> </li><li class="post"> <div class="version_wrapper"> <div class="version_info"> <a href="/releases/v205"> <div class="version_number">2.0.5</div> <time datetime="2025-11-15T00:00:00.000Z" class="date astro-baakmyjh" data-astro-cid-baakmyjh> Nov 15, 2025 </time> </a> </div> </div> <div class="content"> <h1 id="dictsqlite-v205">DictSQLite v2.0.5</h1>
<p><strong>リリース日</strong>: 2025年11月15日<br>
<strong>タイプ</strong>: マイナーリリース</p>
<h2 id="-依存関係の更新">🔧 依存関係の更新</h2>
<h3 id="python-バインディング">Python バインディング</h3>
<ul>
<li>pyo3を0.24.1から0.26へアップグレード</li>
<li>より効率的なPython-Rust間のデータ変換を実現</li>
<li>Python 3.13対応の準備</li>
</ul>
<h3 id="並行データ構造">並行データ構造</h3>
<ul>
<li>dashmapを5.5から6.0へアップグレード</li>
<li>ロックフリーなHashMapのパフォーマンス改善</li>
</ul>
<h3 id="非同期ランタイム">非同期ランタイム</h3>
<ul>
<li>tokioを1.35から1.40へアップグレード</li>
<li>非同期処理の効率向上</li>
</ul>
<h2 id="-パフォーマンス">📊 パフォーマンス</h2>
<p>依存関係の更新により、以下のパフォーマンス向上を実現:</p>
<ul>
<li>Python-Rust間のデータ変換が約10%高速化</li>
<li>並行アクセス時のロック競合が減少</li>
<li>非同期処理のレイテンシが改善</li>
</ul>
<h2 id="-改善点">🔧 改善点</h2>
<h3 id="ビルドプロセスの最適化">ビルドプロセスの最適化</h3>
<ul>
<li>より新しいコンパイラ最適化を活用</li>
<li>ビルド時間の短縮</li>
</ul>
<h3 id="メモリ管理の改善">メモリ管理の改善</h3>
<ul>
<li>pyo3の新しいメモリ管理機能を活用</li>
<li>より効率的なリファレンスカウンティング</li>
</ul>
<h2 id="-互換性">📖 互換性</h2>
<ul>
<li>Python 3.9以上(Python 3.13も動作確認済み)</li>
<li>v2.0.0~v2.0.4との完全な互換性を維持</li>
<li>既存のコードは変更不要</li>
</ul>
<h2 id="-技術的変更">📝 技術的変更</h2>
<h3 id="主要な依存関係バージョン">主要な依存関係バージョン</h3>
<table><thead><tr><th>パッケージ</th><th>v2.0.4</th><th>v2.0.5</th></tr></thead><tbody><tr><td>pyo3</td><td>0.24.1</td><td>0.26</td></tr><tr><td>dashmap</td><td>5.5</td><td>6.0</td></tr><tr><td>tokio</td><td>1.35</td><td>1.40</td></tr></tbody></table>
<h3 id="api変更">API変更</h3>
<p>Python APIには変更はありません。全てのコードが引き続き動作します。</p>
<h2 id="-使用方法">🚀 使用方法</h2>
<p>インストールまたはアップグレード:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">pip</span><span style="color:#9ECBFF"> install</span><span style="color:#79B8FF"> --upgrade</span><span style="color:#9ECBFF"> dictsqlite</span></span></code></pre>
<p>既存のコードはそのまま動作します:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> DictSQLite</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">db[</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> 'value'</span></span>
<span class="line"><span style="color:#79B8FF">print</span><span style="color:#E1E4E8">(db[</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">]) </span><span style="color:#6A737D"># 'value'</span></span></code></pre>
<h2 id="-ベンチマーク結果">📈 ベンチマーク結果</h2>
<p>v2.0.4と比較したパフォーマンス:</p>
<ul>
<li>書き込み: 約5%向上</li>
<li>読み込み: 約3%向上</li>
<li>混合操作: 約8%向上</li>
<li>並行操作: 約12%向上</li>
</ul>
<h2 id="-将来の展望">🔮 将来の展望</h2>
<p>v2.0.5は安定性とパフォーマンスの改善に注力したリリースです。次のメジャーバージョンに向けて、以下の準備を進めています:</p>
<ul>
<li>Python 3.13の完全サポート</li>
<li>さらなるパフォーマンス最適化</li>
<li>新機能の検討</li>
</ul> </div> </li><li class="post"> <div class="version_wrapper"> <div class="version_info"> <a href="/releases/v204"> <div class="version_number">2.0.4</div> <time datetime="2025-11-01T00:00:00.000Z" class="date astro-baakmyjh" data-astro-cid-baakmyjh> Nov 1, 2025 </time> </a> </div> </div> <div class="content"> <h1 id="dictsqlite-v204">DictSQLite v2.0.4</h1>
<p><strong>リリース日</strong>: 2025年11月1日<br>
<strong>タイプ</strong>: セキュリティパッチリリース(重要)</p>
<h2 id="-セキュリティ修正">🔒 セキュリティ修正</h2>
<h3 id="rustsec-2025-0020の修正">RUSTSEC-2025-0020の修正</h3>
<p><strong>重要度</strong>: 高</p>
<p>pyo3 0.20.3に存在したバッファオーバーフロー脆弱性を修正しました。</p>
<p><strong>問題の内容</strong>:</p>
<ul>
<li>パッケージ: pyo3 0.20.3</li>
<li>脆弱性: バッファオーバーフロー</li>
<li>影響: メモリ破壊の可能性</li>
</ul>
<p><strong>修正内容</strong>:</p>
<ul>
<li>pyo3を0.20.3から0.24.1にアップグレード</li>
<li>Bound API対応により、より安全なメモリ管理を実現</li>
</ul>
<h3 id="コードセキュリティの改善">コードセキュリティの改善</h3>
<p><strong>機密データのログ出力防止</strong></p>
<p>テストコード内で機密情報が平文でログ出力される問題を修正:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># 修正前</span></span>
<span class="line"><span style="color:#79B8FF">print</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">"Password: </span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">password</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">"</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#79B8FF">print</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">"Salary: </span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">salary</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">"</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 修正後</span></span>
<span class="line"><span style="color:#79B8FF">print</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"Password: [REDACTED]"</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#79B8FF">print</span><span style="color:#E1E4E8">(</span><span style="color:#9ECBFF">"Salary: [REDACTED]"</span><span style="color:#E1E4E8">)</span></span></code></pre>
<p><strong>安全な一時ファイルの使用</strong></p>
<p>tempfile.mktemp()の使用を廃止し、安全なmkstemp()に変更:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># 修正前(競合状態のリスク)</span></span>
<span class="line"><span style="color:#E1E4E8">temp_file </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> tempfile.mktemp()</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 修正後(安全)</span></span>
<span class="line"><span style="color:#E1E4E8">fd, temp_file </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> tempfile.mkstemp()</span></span>
<span class="line"><span style="color:#E1E4E8">os.close(fd)</span></span></code></pre>
<h2 id="-セキュリティ検証結果">🔍 セキュリティ検証結果</h2>
<table><thead><tr><th>チェック項目</th><th>v2.0.3</th><th>v2.0.4</th><th>状態</th></tr></thead><tbody><tr><td>Cargo Audit</td><td>1件の脆弱性</td><td>0件</td><td>✅ 合格</td></tr><tr><td>CodeQL (Python)</td><td>5件のアラート</td><td>0件</td><td>✅ 合格</td></tr><tr><td>CodeQL (Rust)</td><td>0件のアラート</td><td>0件</td><td>✅ 合格</td></tr></tbody></table>
<h2 id="-技術的変更">🔧 技術的変更</h2>
<h3 id="依存関係のアップグレード">依存関係のアップグレード</h3>
<table><thead><tr><th>パッケージ</th><th>v2.0.3</th><th>v2.0.4</th></tr></thead><tbody><tr><td>pyo3</td><td>0.20.3</td><td>0.24.1</td></tr></tbody></table>
<h3 id="api変更">API変更</h3>
<p><strong>Rust API (内部実装のみ)</strong>:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="rust"><code><span class="line"><span style="color:#6A737D">// v2.0.3</span></span>
<span class="line"><span style="color:#E1E4E8">#[pymodule]</span></span>
<span class="line"><span style="color:#F97583">fn</span><span style="color:#B392F0"> dictsqlite</span><span style="color:#E1E4E8">(_py</span><span style="color:#F97583">:</span><span style="color:#B392F0"> Python</span><span style="color:#E1E4E8">, m</span><span style="color:#F97583">:</span><span style="color:#F97583"> &</span><span style="color:#B392F0">PyModule</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">-></span><span style="color:#B392F0"> PyResult</span><span style="color:#E1E4E8"><()> { }</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D">// v2.0.4 (Bound API)</span></span>
<span class="line"><span style="color:#E1E4E8">#[pymodule]</span></span>
<span class="line"><span style="color:#F97583">fn</span><span style="color:#B392F0"> dictsqlite</span><span style="color:#E1E4E8">(m</span><span style="color:#F97583">:</span><span style="color:#F97583"> &</span><span style="color:#B392F0">Bound</span><span style="color:#E1E4E8"><'</span><span style="color:#B392F0">_</span><span style="color:#E1E4E8">, </span><span style="color:#B392F0">PyModule</span><span style="color:#E1E4E8">>) </span><span style="color:#F97583">-></span><span style="color:#B392F0"> PyResult</span><span style="color:#E1E4E8"><()> { }</span></span></code></pre>
<p><strong>Python API</strong>:</p>
<ul>
<li>変更なし(完全互換)</li>
</ul>
<h2 id="-パフォーマンス">📊 パフォーマンス</h2>
<ul>
<li>実行時性能: 変化なし(100M+ ops/sec維持)</li>
<li>メモリ使用量: 変化なし</li>
<li>ビルド時間: 約2倍(pyo3アップグレードによる一時的な増加)</li>
</ul>
<h2 id="-互換性">📖 互換性</h2>
<ul>
<li>Python 3.9以上</li>
<li>v2.0.0~v2.0.3との完全な互換性を維持</li>
<li>Python側のコードは変更不要</li>
</ul>
<h2 id="-セキュリティ機能">📝 セキュリティ機能</h2>
<p>v2.0.4で提供されるセキュリティ機能:</p>
<ul>
<li>✅ AES-256-GCM暗号化</li>
<li>✅ PBKDF2鍵導出</li>
<li>✅ Safe Pickle検証</li>
<li>✅ SQLインジェクション対策</li>
<li>✅ 依存関係脆弱性対策(NEW)</li>
<li>✅ コード品質保証(NEW)</li>
</ul>
<h2 id="️-重要な推奨事項">⚠️ 重要な推奨事項</h2>
<p>v2.0.3以前のバージョンをお使いの場合は、セキュリティ上の理由から v2.0.4 へのアップグレードを強く推奨します。</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="bash"><code><span class="line"><span style="color:#B392F0">pip</span><span style="color:#9ECBFF"> install</span><span style="color:#79B8FF"> --upgrade</span><span style="color:#9ECBFF"> dictsqlite</span></span></code></pre>
<h2 id="-定期的なセキュリティチェック">🔐 定期的なセキュリティチェック</h2>
<p>今後は以下のツールで定期的にセキュリティチェックを実施します:</p>
<ul>
<li><strong>cargo audit</strong>: Rust依存関係の脆弱性チェック</li>
<li><strong>CodeQL</strong>: 静的コード分析</li>
<li><strong>定期更新</strong>: 四半期ごとのセキュリティ監査</li>
</ul> </div> </li><li class="post"> <div class="version_wrapper"> <div class="version_info"> <a href="/releases/v203"> <div class="version_number">2.0.3</div> <time datetime="2025-10-25T00:00:00.000Z" class="date astro-baakmyjh" data-astro-cid-baakmyjh> Oct 25, 2025 </time> </a> </div> </div> <div class="content"> <h1 id="dictsqlite-v203">DictSQLite v2.0.3</h1>
<p><strong>リリース日</strong>: 2025年10月25日<br>
<strong>タイプ</strong>: パッチリリース(重要な修正)</p>
<h2 id="-重要な修正">🐛 重要な修正</h2>
<h3 id="データベースロック問題の解決">データベースロック問題の解決</h3>
<p>v2.0.2以前のバージョンで発生していた深刻なデータベースロック問題を修正しました。</p>
<p><strong>問題の内容</strong>:</p>
<ul>
<li>並行操作時に <code>apsw.BusyError: database is locked</code> エラーが頻発</li>
<li>バルク操作(bulk_insert, bulk_get)が使用不可能</li>
<li>高並行シナリオでの不安定性</li>
</ul>
<p><strong>根本原因</strong>:</p>
<ol>
<li>不適切なExecutor管理により複数スレッドが同一データベースにアクセス</li>
<li>EXCLUSIVEロックモードにより並行接続が阻害される</li>
<li>自動フラッシュとバルク操作の競合</li>
</ol>
<h3 id="実装された解決策">実装された解決策</h3>
<p><strong>1. キューベースの操作シリアライゼーション</strong></p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># 全てのデータベース操作をasyncio.Queueでシリアライズ</span></span>
<span class="line"><span style="color:#79B8FF">self</span><span style="color:#E1E4E8">._operation_queue </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> asyncio.Queue()</span></span>
<span class="line"><span style="color:#79B8FF">self</span><span style="color:#E1E4E8">._worker_task </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> asyncio.create_task(</span><span style="color:#79B8FF">self</span><span style="color:#E1E4E8">._process_operations())</span></span></code></pre>
<p><strong>2. 永続的なThreadPoolExecutor</strong></p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># 単一スレッドの永続的Executorで同一スレッドローカル接続を使用</span></span>
<span class="line"><span style="color:#79B8FF">self</span><span style="color:#E1E4E8">._executor </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> ThreadPoolExecutor(</span><span style="color:#FFAB70">max_workers</span><span style="color:#F97583">=</span><span style="color:#79B8FF">1</span><span style="color:#E1E4E8">)</span></span></code></pre>
<p><strong>3. NORMALロックモード</strong></p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># 複数接続の共存を許可</span></span>
<span class="line"><span style="color:#9ECBFF">'locking_mode'</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">'NORMAL'</span><span style="color:#6A737D"> # EXCLUSIVEから変更</span></span></code></pre>
<p><strong>4. 自動フラッシュの無効化</strong></p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># 書き込みバッファの自動フラッシュを無効化、明示的なaflush()のみ許可</span></span>
<span class="line"><span style="color:#79B8FF">self</span><span style="color:#E1E4E8">._sync_db._write_buffer.flush_threshold </span><span style="color:#F97583">=</span><span style="color:#79B8FF"> 1000000</span></span></code></pre>
<h2 id="-パフォーマンス">📊 パフォーマンス</h2>
<p>修正後のベンチマーク結果:</p>
<ul>
<li>50件の並行書き込み: 10,027 ops/s ✅</li>
<li>50件の並行読み込み: 145,345 ops/s ✅</li>
<li>100件の混合操作: 21,707 ops/s ✅</li>
<li>200件のバルク挿入: 133,580 ops/s ✅</li>
<li>300件の高並行: 12,974 ops/s ✅</li>
<li>キャッシュヒット率: 80.0%</li>
</ul>
<h2 id="-改善点">🔧 改善点</h2>
<h3 id="並行処理の安定性">並行処理の安定性</h3>
<ul>
<li>全28件の既存テストがパス</li>
<li>7件の新しいストレステストを追加し、全てパス</li>
<li>高負荷環境での安定動作を確認</li>
</ul>
<h3 id="テスト範囲の拡大">テスト範囲の拡大</h3>
<p>追加されたストレステスト:</p>
<ul>
<li>並行書き込み(100操作)</li>
<li>並行読み込み(100操作)</li>
<li>混合操作(200操作)</li>
<li>並行バルク操作(10 × 100アイテム)</li>
<li>高並行(500操作)</li>
<li>並行削除(50操作)</li>
<li>フラッシュを伴う並行操作(100操作)</li>
</ul>
<h2 id="-互換性">📖 互換性</h2>
<ul>
<li>Python 3.9以上</li>
<li>v2.0.0~v2.0.2との完全な互換性を維持</li>
<li>既存のコードは変更不要で動作</li>
</ul>
<h2 id="-使用方法">📝 使用方法</h2>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#F97583">import</span><span style="color:#E1E4E8"> asyncio</span></span>
<span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> AsyncDictSQLite</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">async</span><span style="color:#F97583"> def</span><span style="color:#B392F0"> example</span><span style="color:#E1E4E8">():</span></span>
<span class="line"><span style="color:#F97583"> async</span><span style="color:#F97583"> with</span><span style="color:#E1E4E8"> AsyncDictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">as</span><span style="color:#E1E4E8"> db:</span></span>
<span class="line"><span style="color:#6A737D"> # 並行操作が安定して動作</span></span>
<span class="line"><span style="color:#E1E4E8"> tasks </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> [db.aset(</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">'key_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span><span style="color:#E1E4E8">, </span><span style="color:#F97583">f</span><span style="color:#9ECBFF">'value_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">for</span><span style="color:#E1E4E8"> i </span><span style="color:#F97583">in</span><span style="color:#79B8FF"> range</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">100</span><span style="color:#E1E4E8">)]</span></span>
<span class="line"><span style="color:#F97583"> await</span><span style="color:#E1E4E8"> asyncio.gather(</span><span style="color:#F97583">*</span><span style="color:#E1E4E8">tasks)</span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#6A737D"> # バルク操作も問題なく動作</span></span>
<span class="line"><span style="color:#E1E4E8"> data </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> {</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">'bulk_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span><span style="color:#E1E4E8">: </span><span style="color:#F97583">f</span><span style="color:#9ECBFF">'value_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span><span style="color:#F97583"> for</span><span style="color:#E1E4E8"> i </span><span style="color:#F97583">in</span><span style="color:#79B8FF"> range</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">100</span><span style="color:#E1E4E8">)}</span></span>
<span class="line"><span style="color:#F97583"> await</span><span style="color:#E1E4E8"> db.abulk_insert(data)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">asyncio.run(example())</span></span></code></pre>
<h2 id="️-重要な注意事項">⚠️ 重要な注意事項</h2>
<p>非同期機能を使用している場合は、v2.0.3へのアップグレードを強く推奨します。このバージョンではデータベースロック問題が完全に解決されています。</p> </div> </li><li class="post"> <div class="version_wrapper"> <div class="version_info"> <a href="/releases/v202"> <div class="version_number">2.0.2</div> <time datetime="2025-10-20T00:00:00.000Z" class="date astro-baakmyjh" data-astro-cid-baakmyjh> Oct 20, 2025 </time> </a> </div> </div> <div class="content"> <h1 id="dictsqlite-v202">DictSQLite v2.0.2</h1>
<p><strong>リリース日</strong>: 2025年10月20日<br>
<strong>タイプ</strong>: マイナーリリース</p>
<h2 id="-新機能">🚀 新機能</h2>
<h3 id="辞書互換api実装">辞書互換API実装</h3>
<p>標準的なPython辞書と同じインターフェースで操作できるメソッドを追加しました。</p>
<ul>
<li><code>items()</code> - (key, value)タプルのイテレータを返す</li>
<li><code>values()</code> - 全値のイテレータを返す</li>
<li><code>update(dict)</code> - 辞書で一括更新</li>
<li><code>pop(key, default=None)</code> - キーを削除して値を返す</li>
<li><code>setdefault(key, default=None)</code> - キーが存在しない場合のみデフォルト値を設定</li>
</ul>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> DictSQLite</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 辞書と同じように使える</span></span>
<span class="line"><span style="color:#E1E4E8">db.update({</span><span style="color:#9ECBFF">'key1'</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">'value1'</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">'key2'</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">'value2'</span><span style="color:#E1E4E8">})</span></span>
<span class="line"><span style="color:#79B8FF">print</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">list</span><span style="color:#E1E4E8">(db.items())) </span><span style="color:#6A737D"># [('key1', 'value1'), ('key2', 'value2')]</span></span>
<span class="line"><span style="color:#79B8FF">print</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">list</span><span style="color:#E1E4E8">(db.values())) </span><span style="color:#6A737D"># ['value1', 'value2']</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">value </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> db.pop(</span><span style="color:#9ECBFF">'key1'</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">'default'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">db.setdefault(</span><span style="color:#9ECBFF">'new_key'</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">'default_value'</span><span style="color:#E1E4E8">)</span></span></code></pre>
<h2 id="-改善点">🔧 改善点</h2>
<h3 id="v188との互換性強化">v1.8.8との互換性強化</h3>
<ul>
<li>v1.8.8で使用していたコードをほぼそのまま移行可能に</li>
<li>辞書互換メソッドにより、既存のPythonコードとの統合が容易に</li>
</ul>
<h3 id="永続化モード対応">永続化モード対応</h3>
<ul>
<li>追加されたメソッドは全ての永続化モード(Memory/Lazy/WriteThrough)で動作</li>
<li>各モードの特性に応じた最適化を実施</li>
</ul>
<h2 id="-パフォーマンス">📊 パフォーマンス</h2>
<p>新しいメソッドもRust実装の高速性を維持:</p>
<ul>
<li><code>update()</code>: バルク挿入により高速動作</li>
<li><code>items()</code>/<code>values()</code>: イテレータにより省メモリ</li>
<li>v2.0.1のパフォーマンス特性を維持</li>
</ul>
<h2 id="-互換性">📖 互換性</h2>
<ul>
<li>Python 3.9以上</li>
<li>v2.0.0、v2.0.1との完全な互換性を維持</li>
</ul>
<h2 id="-使用例">📝 使用例</h2>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> DictSQLite</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># v1.8.8スタイルの辞書操作がそのまま使える</span></span>
<span class="line"><span style="color:#E1E4E8">data </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> {</span><span style="color:#9ECBFF">'name'</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">'Alice'</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">'age'</span><span style="color:#E1E4E8">: </span><span style="color:#79B8FF">30</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">'city'</span><span style="color:#E1E4E8">: </span><span style="color:#9ECBFF">'Tokyo'</span><span style="color:#E1E4E8">}</span></span>
<span class="line"><span style="color:#E1E4E8">db.update(data)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># イテレーション</span></span>
<span class="line"><span style="color:#F97583">for</span><span style="color:#E1E4E8"> key, value </span><span style="color:#F97583">in</span><span style="color:#E1E4E8"> db.items():</span></span>
<span class="line"><span style="color:#79B8FF"> print</span><span style="color:#E1E4E8">(</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">"</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">key</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">: </span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">value</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">"</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># デフォルト値の設定</span></span>
<span class="line"><span style="color:#E1E4E8">db.setdefault(</span><span style="color:#9ECBFF">'country'</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">'Japan'</span><span style="color:#E1E4E8">)</span></span></code></pre> </div> </li><li class="post"> <div class="version_wrapper"> <div class="version_info"> <a href="/releases/v201"> <div class="version_number">2.0.1</div> <time datetime="2025-10-15T00:00:00.000Z" class="date astro-baakmyjh" data-astro-cid-baakmyjh> Oct 15, 2025 </time> </a> </div> </div> <div class="content"> <h1 id="dictsqlite-v201">DictSQLite v2.0.1</h1>
<p><strong>リリース日</strong>: 2025年10月15日<br>
<strong>タイプ</strong>: パッチリリース</p>
<h2 id="-バグ修正">🐛 バグ修正</h2>
<h3 id="非同期処理の安定性向上">非同期処理の安定性向上</h3>
<ul>
<li>AsyncDictSQLiteの永続化機能を実装</li>
<li>Memory/Lazy/WriteThroughモードに対応</li>
<li>ストレージフォールバック機能を追加し、キャッシュミス時のデータアクセスを改善</li>
</ul>
<h3 id="lruキャッシュエビクション実装">LRUキャッシュエビクション実装</h3>
<ul>
<li>LRUキャッシュによる自動メモリ管理を実装</li>
<li>アクセスパターンの追跡機能を追加</li>
<li>容量超過時の透過的なストレージ退避により、メモリリーク防止を実現</li>
</ul>
<h2 id="-改善点">🔧 改善点</h2>
<h3 id="ストレージ層の改善">ストレージ層の改善</h3>
<ul>
<li><code>flush()</code>および<code>close()</code>メソッドを追加し、データの永続化を確実に実行</li>
<li>キャッシュミス時のフォールバック動作を最適化</li>
</ul>
<h3 id="メモリ管理の強化">メモリ管理の強化</h3>
<ul>
<li>LRUエビクションにより、大規模データセットでも安定動作</li>
<li>メモリ使用量の無制限な増加を防止</li>
</ul>
<h2 id="-パフォーマンス">📊 パフォーマンス</h2>
<p>v2.0.0のパフォーマンスを維持しつつ、安定性を向上:</p>
<h2 id="-パフォーマンス-1">📊 パフォーマンス</h2>
<ul>
<li>メモリ使用量の無制限な増加を防止</li>
<li>LRUエビクションにより、大規模データセットでも安定動作</li>
</ul>
<h3 id="メモリ管理の強化-1">メモリ管理の強化</h3>
<ul>
<li>キャッシュミス時のフォールバック動作を最適化</li>
<li><code>flush()</code>および<code>close()</code>メソッドを追加し、データの永続化を確実に実行</li>
</ul>
<h3 id="ストレージ層の改善-1">ストレージ層の改善</h3>
<h2 id="-改善点-1">🔧 改善点</h2>
<ul>
<li>容量超過時の透過的なストレージ退避により、メモリリーク防止を実現</li>
<li>アクセスパターンの追跡機能を追加</li>
<li>LRUキャッシュによる自動メモリ管理を実装</li>
</ul>
<h3 id="lruキャッシュエビクション実装-1">LRUキャッシュエビクション実装</h3>
<ul>
<li>ストレージフォールバック機能を追加し、キャッシュミス時のデータアクセスを改善</li>
<li>Memory/Lazy/WriteThroughモードに対応</li>
<li>AsyncDictSQLiteの永続化機能を実装</li>
</ul>
<h3 id="非同期処理の安定性向上-1">非同期処理の安定性向上</h3>
<h2 id="-バグ修正-1">🐛 バグ修正</h2>
<p><strong>タイプ</strong>: パッチリリース
<strong>リリース日</strong>: 2025年10月15日</p>
<h1 id="dictsqlite-v201-1">DictSQLite v2.0.1</h1>
<hr>
<p>tags: [“async”, “stability”, “bugfix”]
type: “patch”
date: “2025-10-15”
versionNumber: “2.0.1”
description: “非同期処理の安定性向上とストレージフォールバック実装”
title: “DictSQLite v2.0.1”</p> </div> </li><li class="post"> <div class="version_wrapper"> <div class="version_info"> <a href="/releases/v200"> <div class="version_number">2.0.0</div> <time datetime="2025-10-09T00:00:00.000Z" class="date astro-baakmyjh" data-astro-cid-baakmyjh> Oct 9, 2025 </time> </a> </div> </div> <div class="content"> <h1 id="dictsqlite-v200">DictSQLite v2.0.0</h1>
<p><strong>リリース日</strong>: 2025年10月9日<br>
<strong>タイプ</strong>: メジャーリリース<br>
<strong>コードネーム</strong>: v4.2(内部バージョン)</p>
<h2 id="-メジャーリリースの概要">🎉 メジャーリリースの概要</h2>
<p>DictSQLite v2.0.0は、<strong>Rust実装による完全な書き直し</strong>により、v1.8.8から<strong>5~300倍のパフォーマンス向上</strong>を実現したメジャーアップデートです。</p>
<h3 id="主要な改善">主要な改善</h3>
<table><thead><tr><th>改善項目</th><th>効果</th></tr></thead><tbody><tr><td><strong>非同期書き込み</strong></td><td>最大300倍の高速化</td></tr><tr><td><strong>同期WriteThrough書き込み</strong></td><td>最大43倍の高速化</td></tr><tr><td><strong>バッチ読み込み</strong></td><td>5-10倍の高速化</td></tr><tr><td><strong>メモリ管理</strong></td><td>LRUキャッシュによる効率的なメモリ使用</td></tr><tr><td><strong>暗号化</strong></td><td>AES-256-GCM による強力なネイティブ暗号化</td></tr><tr><td><strong>非同期処理</strong></td><td>True Python asyncio サポート</td></tr></tbody></table>
<hr>
<h2 id="-新機能">🚀 新機能</h2>
<h3 id="1-rust実装による高速化">1. Rust実装による高速化</h3>
<p><strong>完全なRust書き直し(PyO3バインディング)</strong></p>
<ul>
<li>
<p><strong>非同期書き込み</strong>: 1000件の書き込み 30秒 → 0.1秒(<strong>300倍高速化</strong>)</p>
<ul>
<li>Mutexロック回数: 1000回 → 10回(100倍削減)</li>
<li>SQLトランザクション数: 1000回 → 10回(100倍削減)</li>
</ul>
</li>
<li>
<p><strong>同期WriteThrough書き込み</strong>: 29.79K ops/sec → 1.30M ops/sec(<strong>43倍高速化</strong>)</p>
<ul>
<li>バッチ書き込みバッファの実装</li>
<li>個別SQL INSERT → バッチINSERT</li>
</ul>
</li>
<li>
<p><strong>バッチ読み込み</strong>: キャッシュミス時に<strong>5-10倍高速化</strong></p>
<ul>
<li>SQLクエリ数: N回 → 1回</li>
<li>並列キャッシュアクセス</li>
</ul>
</li>
</ul>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> DictSQLite</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># buffer_sizeで書き込みバッファを調整可能</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'fast.db'</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">buffer_size</span><span style="color:#F97583">=</span><span style="color:#79B8FF">200</span><span style="color:#E1E4E8">) </span><span style="color:#6A737D"># デフォルト: 100</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># 大量書き込みが劇的に高速化</span></span>
<span class="line"><span style="color:#F97583">for</span><span style="color:#E1E4E8"> i </span><span style="color:#F97583">in</span><span style="color:#79B8FF"> range</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">10000</span><span style="color:#E1E4E8">):</span></span>
<span class="line"><span style="color:#E1E4E8"> db[</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">'key_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#F97583"> f</span><span style="color:#9ECBFF">'value_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">'</span></span>
<span class="line"><span style="color:#6A737D"># v1.8.8: ~30秒 → v2.0.0: ~0.1秒</span></span></code></pre>
<h3 id="2-true-python-asyncio-サポート">2. True Python Asyncio サポート</h3>
<p><strong>完全な async/await サポート</strong></p>
<p>v1.8.8では非対応だった非同期処理が、v2.0.0で完全にサポートされました。</p>
<p><strong>v1.8.8 (非対応)</strong>:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># 同期処理のみ</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'db.db'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">db[</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> 'value'</span></span></code></pre>
<p><strong>v2.0.0 (完全async対応)</strong>:</p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#F97583">import</span><span style="color:#E1E4E8"> asyncio</span></span>
<span class="line"><span style="color:#F97583">from</span><span style="color:#E1E4E8"> dictsqlite </span><span style="color:#F97583">import</span><span style="color:#E1E4E8"> AsyncDictSQLite</span></span>
<span class="line"></span>
<span class="line"><span style="color:#F97583">async</span><span style="color:#F97583"> def</span><span style="color:#B392F0"> main</span><span style="color:#E1E4E8">():</span></span>
<span class="line"><span style="color:#F97583"> async</span><span style="color:#F97583"> with</span><span style="color:#E1E4E8"> AsyncDictSQLite(</span><span style="color:#9ECBFF">"mydb.db"</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">as</span><span style="color:#E1E4E8"> db:</span></span>
<span class="line"><span style="color:#6A737D"> # 真の awaitable メソッド</span></span>
<span class="line"><span style="color:#F97583"> await</span><span style="color:#E1E4E8"> db.aset(</span><span style="color:#9ECBFF">"key"</span><span style="color:#E1E4E8">, </span><span style="color:#9ECBFF">"value"</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8"> value </span><span style="color:#F97583">=</span><span style="color:#F97583"> await</span><span style="color:#E1E4E8"> db.aget(</span><span style="color:#9ECBFF">"key"</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8"> </span></span>
<span class="line"><span style="color:#6A737D"> # 並列処理が可能</span></span>
<span class="line"><span style="color:#E1E4E8"> tasks </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> [db.aset(</span><span style="color:#F97583">f</span><span style="color:#9ECBFF">"key_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">"</span><span style="color:#E1E4E8">, </span><span style="color:#F97583">f</span><span style="color:#9ECBFF">"value_</span><span style="color:#79B8FF">{</span><span style="color:#E1E4E8">i</span><span style="color:#79B8FF">}</span><span style="color:#9ECBFF">"</span><span style="color:#E1E4E8">) </span><span style="color:#F97583">for</span><span style="color:#E1E4E8"> i </span><span style="color:#F97583">in</span><span style="color:#79B8FF"> range</span><span style="color:#E1E4E8">(</span><span style="color:#79B8FF">100</span><span style="color:#E1E4E8">)]</span></span>
<span class="line"><span style="color:#F97583"> await</span><span style="color:#E1E4E8"> asyncio.gather(</span><span style="color:#F97583">*</span><span style="color:#E1E4E8">tasks)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#E1E4E8">asyncio.run(main())</span></span></code></pre>
<p><strong>新しい awaitable メソッド</strong>:</p>
<ul>
<li><code>async aget(key)</code> - 非同期で値を取得</li>
<li><code>async aset(key, value)</code> - 非同期で値を設定</li>
<li><code>async abatch_get(keys)</code> - 非同期で複数値を取得</li>
<li><code>async abatch_set(items)</code> - 非同期で複数値を設定</li>
</ul>
<h3 id="3-aes-256-gcm暗号化">3. AES-256-GCM暗号化</h3>
<p><strong>v1.8.8のAES-CBCから大幅に強化</strong></p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># パスワードベースの簡単な暗号化</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'secure.db'</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">encryption_password</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">'my_password'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">db[</span><span style="color:#9ECBFF">'secret'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> 'sensitive data'</span></span></code></pre>
<p><strong>v2.0.0の暗号化機能</strong>:</p>
<ul>
<li>AES-256-GCM(認証付き暗号化)</li>
<li>PBKDF2-HMAC-SHA256による鍵導出(100,000回反復)</li>
<li>Rust実装による高速な暗号化/復号化</li>
<li>完全性検証の自動実行</li>
</ul>
<h3 id="4-safe-pickle検証">4. Safe Pickle検証</h3>
<p><strong>セキュリティ強化</strong></p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">enable_safe_pickle</span><span style="color:#F97583">=</span><span style="color:#79B8FF">True</span><span style="color:#E1E4E8">)</span></span></code></pre>
<ul>
<li>ホワイトリストベースの検証</li>
<li>危険な関数・モジュールの明示的拒否</li>
<li>Rustレベルでの事前検証</li>
</ul>
<h3 id="5-複数の永続化モード">5. 複数の永続化モード</h3>
<p><strong>用途に応じた最適なモードを選択</strong></p>
<pre class="astro-code github-dark" style="background-color:#24292e;color:#e1e4e8; overflow-x: auto;" tabindex="0" data-language="python"><code><span class="line"><span style="color:#6A737D"># Memory: 最高速、永続化なし</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">persist_mode</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">'memory'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># Lazy: 高速、手動フラッシュで永続化</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">persist_mode</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">'lazy'</span><span style="color:#E1E4E8">)</span></span>
<span class="line"><span style="color:#E1E4E8">db[</span><span style="color:#9ECBFF">'key'</span><span style="color:#E1E4E8">] </span><span style="color:#F97583">=</span><span style="color:#9ECBFF"> 'value'</span></span>
<span class="line"><span style="color:#E1E4E8">db.flush() </span><span style="color:#6A737D"># 明示的に永続化</span></span>
<span class="line"></span>
<span class="line"><span style="color:#6A737D"># WriteThrough: 即座に永続化(デフォルト)</span></span>
<span class="line"><span style="color:#E1E4E8">db </span><span style="color:#F97583">=</span><span style="color:#E1E4E8"> DictSQLite(</span><span style="color:#9ECBFF">'data.db'</span><span style="color:#E1E4E8">, </span><span style="color:#FFAB70">persist_mode</span><span style="color:#F97583">=</span><span style="color:#9ECBFF">'writethrough'</span><span style="color:#E1E4E8">)</span></span></code></pre>
<h2 id="-パフォーマンス比較">📊 パフォーマンス比較</h2>
<h3 id="v188-vs-v200">v1.8.8 vs v2.0.0</h3>
<table><thead><tr><th>操作</th><th>v1.8.8</th><th>v2.0.0</th><th>改善率</th></tr></thead><tbody><tr><td>非同期書き込み 1000件</td><td>30秒</td><td>0.1秒</td><td><strong>300倍</strong></td></tr><tr><td>同期書き込み</td><td>29.79K ops/s</td><td>1.30M ops/s</td><td><strong>43倍</strong></td></tr><tr><td>バッチ読み込み</td><td>-</td><td>-</td><td><strong>5-10倍</strong></td></tr><tr><td>メモリ効率</td><td>標準</td><td>LRU最適化</td><td>大幅改善</td></tr></tbody></table>
<h3 id="モード別性能">モード別性能</h3>