公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#中使用SQLite進(jìn)行大數(shù)據(jù)量高效處理

admin
2025年3月24日 18:30 本文熱度 567

在現(xiàn)代軟件開發(fā)中,高效處理大數(shù)據(jù)量是一個(gè)常見且具有挑戰(zhàn)性的任務(wù)。SQLite作為一個(gè)輕量級(jí)、無(wú)服務(wù)器的關(guān)系型數(shù)據(jù)庫(kù),在C#中提供了強(qiáng)大的數(shù)據(jù)處理能力。本文將深入探討如何使用SQLite優(yōu)化大數(shù)據(jù)量的存儲(chǔ)和檢索。

準(zhǔn)備工作

首先,我們需要引入必要的NuGet包:

// 使用System.Data.SQLite進(jìn)行SQLite數(shù)據(jù)庫(kù)操作
using System.Data.SQLite;

大數(shù)據(jù)量處理的關(guān)鍵技術(shù)

數(shù)據(jù)實(shí)體類 

// 數(shù)據(jù)實(shí)體類  
public class DataItem
{

    public long Id { get; set; }
    public string Name { get; set; }
    public decimal Value { get; set; }
    public DateTime Timestamp { get; set; }
}

批量插入優(yōu)化 

using System;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AppBigData
{
    publicclass DataProcessor
    {

        private readonly string _connectionString;

        public DataProcessor(string connectionString = "Data Source=large_database.db")
        
{
            _connectionString = connectionString;
        }

        // 創(chuàng)建表結(jié)構(gòu)  
        public void CreateTableIfNotExists()
        
{
            using (var connection = new SQLiteConnection(_connectionString))
            {
                connection.Open();
                using (var command = new SQLiteCommand(connection))
                {
                    command.CommandText = @"  
                    CREATE TABLE IF NOT EXISTS DataTable (  
                        Id INTEGER PRIMARY KEY,  
                        Name TEXT NOT NULL,  
                        Value REAL NOT NULL,  
                        Timestamp TEXT NOT NULL  
                    )"
;
                    command.ExecuteNonQuery();
                }
            }
        }

        // 批量插入數(shù)據(jù)的高效方法  
        public void BulkInsert(List<DataItem> items)
        
{
            if (items == null || !items.Any())
                return;

            try
            {
                // 使用事務(wù)大幅提升插入性能  
                using (var connection = new SQLiteConnection(_connectionString))
                {
                    connection.Open();
                    using (var transaction = connection.BeginTransaction())
                    {
                        try
                        {
                            using (var command = new SQLiteCommand(connection))
                            {
                                // 預(yù)編譯SQL語(yǔ)句  
                                command.CommandText = @"  
                                INSERT INTO DataTable   
                                (Id, Name, Value, Timestamp)   
                                VALUES   
                                (@Id, @Name, @Value, @Timestamp)"
;

                                // 準(zhǔn)備參數(shù)  
                                command.Parameters.Add("@Id", System.Data.DbType.Int64);
                                command.Parameters.Add("@Name", System.Data.DbType.String);
                                command.Parameters.Add("@Value", System.Data.DbType.Decimal);
                                command.Parameters.Add("@Timestamp", System.Data.DbType.DateTime);

                                // 批量插入  
                                foreach (var item in items)
                                {
                                    command.Parameters["@Id"].Value = item.Id;
                                    command.Parameters["@Name"].Value = item.Name;
                                    command.Parameters["@Value"].Value = item.Value;
                                    command.Parameters["@Timestamp"].Value = item.Timestamp;

                                    command.ExecuteNonQuery();
                                }
                            }

                            // 提交事務(wù)  
                            transaction.Commit();
                        }
                        catch (Exception)
                        {
                            // 出錯(cuò)時(shí)回滾事務(wù)  
                            transaction.Rollback();
                            throw;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"批量插入數(shù)據(jù)時(shí)發(fā)生錯(cuò)誤: {ex.Message}");
                throw;
            }
        }

        /// <summary>
        /// 改進(jìn)的批量插入方法 - 使用SQLite的批處理特性和事務(wù)
        /// 這里batchSize很重要,太大了不行,太小了也不行
        /// </summary>
        /// <param name="items"></param>
        /// <param name="batchSize"></param>
        public void ImprovedBulkInsert(List<DataItem> items, int batchSize = 100)
        
{
            if (items == null || !items.Any())
                return;

            try
            {
                using (var connection = new SQLiteConnection(_connectionString))
                {
                    connection.Open();

                    // 保留性能優(yōu)化的pragmas  
                    using (var pragmaCommand = new SQLiteCommand(connection))
                    {
                        pragmaCommand.CommandText = "PRAGMA synchronous = OFF; PRAGMA journal_mode = MEMORY;";
                        pragmaCommand.ExecuteNonQuery();
                    }

                    // 不使用using語(yǔ)句來(lái)管理事務(wù),這樣我們可以重新創(chuàng)建它  
                    SQLiteTransaction transaction = connection.BeginTransaction();

                    try
                    {
                        using (var command = new SQLiteCommand(connection))
                        {
                            command.CommandText = @"INSERT INTO DataTable (Id, Name, Value, Timestamp)   
                                          VALUES (@Id, @Name, @Value, @Timestamp)"
;

                            // 一次性準(zhǔn)備參數(shù)  
                            command.Parameters.Add("@Id", System.Data.DbType.Int64);
                            command.Parameters.Add("@Name", System.Data.DbType.String);
                            command.Parameters.Add("@Value", System.Data.DbType.Decimal);
                            command.Parameters.Add("@Timestamp", System.Data.DbType.DateTime);

                            // 以較小的批次處理  
                            int count = 0;
                            foreach (var item in items)
                            {
                                command.Parameters["@Id"].Value = item.Id;
                                command.Parameters["@Name"].Value = item.Name;
                                command.Parameters["@Value"].Value = item.Value;
                                command.Parameters["@Timestamp"].Value = item.Timestamp;
                                command.ExecuteNonQuery();

                                count++;
                                // 分批提交,平衡內(nèi)存使用和事務(wù)開銷  
                                if (count % batchSize == 0)
                                {
                                    transaction.Commit();
                                    // 創(chuàng)建新的事務(wù)  
                                    transaction = connection.BeginTransaction();
                                }
                            }

                            // 提交剩余的記錄  
                            transaction.Commit();
                        }
                    }
                    catch
                    {
                        transaction.Rollback();
                        throw;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"改進(jìn)型批量插入數(shù)據(jù)時(shí)發(fā)生錯(cuò)誤: {ex.Message}");
                throw;
            }
        }

        // 基準(zhǔn)測(cè)試方法  
        public void PerformanceBenchmark(int itemCount = 10000)
        
{
            // 清空表  
            ClearTable();

            // 生成測(cè)試數(shù)據(jù)  
            var testData = GenerateTestData(itemCount);

            // 測(cè)試標(biāo)準(zhǔn)批量插入  
            Console.WriteLine($"開始標(biāo)準(zhǔn)批量插入測(cè)試 ({itemCount} 條記錄)...");
            var standardTimer = Stopwatch.StartNew();
            BulkInsert(testData);
            standardTimer.Stop();
            Console.WriteLine($"標(biāo)準(zhǔn)批量插入完成: {standardTimer.ElapsedMilliseconds} ms");

            // 清空表  
            ClearTable();

            // 測(cè)試增強(qiáng)型批量插入  
            Console.WriteLine($"開始增強(qiáng)型批量插入測(cè)試 ({itemCount} 條記錄)...");
            var enhancedTimer = Stopwatch.StartNew();
            ImprovedBulkInsert(testData);
            enhancedTimer.Stop();
            Console.WriteLine($"增強(qiáng)型批量插入完成: {enhancedTimer.ElapsedMilliseconds} ms");


            // 比較結(jié)果  
            double improvement = (double)standardTimer.ElapsedMilliseconds / enhancedTimer.ElapsedMilliseconds;
            Console.WriteLine($"性能提升比例: {improvement:F2}");
        }

        // 生成測(cè)試數(shù)據(jù)  
        private List<DataItem> GenerateTestData(int count)
        {
            var random = new Random();
            var result = new List<DataItem>(count);

            for (int i = 0; i < count; i++)
            {
                result.Add(new DataItem
                {
                    Id = i + 1,
                    Name = $"Item-{i}",
                    Value = (decimal)(random.NextDouble() * 1000),
                    Timestamp = DateTime.Now.AddSeconds(-random.Next(086400))
                });
            }

            return result;
        }

        // 清空表  
        private void ClearTable()
        
{
            using (var connection = new SQLiteConnection(_connectionString))
            {
                connection.Open();
                using (var command = new SQLiteCommand("DELETE FROM DataTable", connection))
                {
                    command.ExecuteNonQuery();
                }
            }
        }
    }
}

調(diào)用

namespace AppBigData
{
    internal class Program
    {

        static void Main(string[] args)
        
{
            var processor = new DataProcessor();

            // 確保表存在  
            processor.CreateTableIfNotExists();

            // 執(zhí)行性能測(cè)試  
            processor.PerformanceBenchmark(500000);

            Console.WriteLine("示例數(shù)據(jù)插入完成");

            Console.ReadKey();
        }
    }
}

分頁(yè)查詢與索引優(yōu)化 

public class DataRetriever
{

    // 分頁(yè)查詢大數(shù)據(jù)集
    public List<DataItem> GetPaginatedData(int pageNumber, int pageSize)
    {
        var results = new List<DataItem>();

        using (var connection = new SQLiteConnection("Data Source=large_database.db"))
        {
            connection.Open();

            // 使用參數(shù)化查詢提高安全性和性能
            using (var command = new SQLiteCommand(connection))
            {
                command.CommandText = @"
                    SELECT Id, Name, Value, Timestamp 
                    FROM DataTable 
                    ORDER BY Id 
                    LIMIT @PageSize OFFSET @Offset"
;

                command.Parameters.AddWithValue("@PageSize", pageSize);
                command.Parameters.AddWithValue("@Offset", (pageNumber - 1) * pageSize);

                using (var reader = command.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        results.Add(new DataItem
                        {
                            Id = Convert.ToInt64(reader["Id"]),
                            Name = reader["Name"].ToString(),
                            Value = Convert.ToDecimal(reader["Value"]),
                            Timestamp = Convert.ToDateTime(reader["Timestamp"])
                        });
                    }
                }
            }
        }

        return results;
    }

    // 創(chuàng)建性能索引
    public void CreatePerformanceIndex()
    
{
        using (var connection = new SQLiteConnection("Data Source=large_database.db"))
        {
            connection.Open();

            using (var command = new SQLiteCommand(connection))
            {
                // 創(chuàng)建復(fù)合索引
                command.CommandText = @"
                    CREATE INDEX IF NOT EXISTS idx_data_performance 
                    ON DataTable (Timestamp, Value)"
;

                command.ExecuteNonQuery();
            }
        }
    }
}

異步數(shù)據(jù)處理 

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data.SQLite;
using System.Threading;
using System.Threading.Tasks;

namespace AppBigData
{
    publicclass AsyncDataProcessor
    {

        private readonly string _connectionString;

        public AsyncDataProcessor(string connectionString = "Data Source=large_database.db")
        
{
            _connectionString = connectionString;
        }

        // 異步批量處理數(shù)據(jù) - 修改為線程安全方式  
        public async Task ProcessLargeDataSetAsync(List<DataItem> items)
        
{
            if (items == null || items.Count == 0)
                return;

            // 分區(qū)處理數(shù)據(jù)以提高性能  
            var partitionSize = Math.Max(1, items.Count / Environment.ProcessorCount);
            var partitions = new List<List<DataItem>>();

            for (int i = 0; i < items.Count; i += partitionSize)
            {
                var partition = items.GetRange(
                    i,
                    Math.Min(partitionSize, items.Count - i));
                partitions.Add(partition);
            }

            // 記錄處理錯(cuò)誤  
            var exceptions = new ConcurrentBag<Exception>();

            await Task.Run(() =>
            {
                // 每個(gè)分區(qū)用單獨(dú)的連接處理  
                Parallel.ForEach(partitions, new ParallelOptions { MaxDegreeOfParallelism = 4 }, partition =>
                {
                    try
                    {
                        // 每個(gè)線程創(chuàng)建自己的連接  
                        using (var connection = new SQLiteConnection(_connectionString))
                        {
                            connection.Open();

                            // 使用事務(wù)提高性能  
                            using (var transaction = connection.BeginTransaction())
                            {
                                try
                                {
                                    foreach (var item in partition)
                                    {
                                        ProcessSingleItem(connection, item);
                                    }

                                    // 提交此分區(qū)的所有更改  
                                    transaction.Commit();
                                }
                                catch (Exception ex)
                                {
                                    // 如果處理過(guò)程中出錯(cuò),回滾事務(wù)  
                                    transaction.Rollback();
                                    exceptions.Add(ex);
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        exceptions.Add(ex);
                    }
                });
            });

            // 如果有錯(cuò)誤,拋出聚合異常  
            if (exceptions.Count > 0)
            {
                thrownew AggregateException("處理數(shù)據(jù)時(shí)發(fā)生一個(gè)或多個(gè)錯(cuò)誤", exceptions);
            }
        }

        private void ProcessSingleItem(SQLiteConnection connection, DataItem item)
        
{
            // 處理單個(gè)數(shù)據(jù)項(xiàng)的邏輯  
            using (var command = new SQLiteCommand(connection))
            {
                // 首先檢查記錄是否存在  
                command.CommandText = "SELECT COUNT(*) FROM DataTable WHERE Id = @Id";
                command.Parameters.AddWithValue("@Id", item.Id);

                int exists = Convert.ToInt32(command.ExecuteScalar());

                if (exists > 0)
                {
                    // 更新現(xiàn)有記錄  
                    command.CommandText = @"  
                        UPDATE DataTable   
                        SET Name = @Name, Value = @Value, Timestamp = @Timestamp   
                        WHERE Id = @Id"
;
                }
                else
                {
                    // 插入新記錄  
                    command.CommandText = @"  
                        INSERT INTO DataTable (Id, Name, Value, Timestamp)   
                        VALUES (@Id, @Name, @Value, @Timestamp)"
;
                }

                // 設(shè)置參數(shù)  
                command.Parameters.Clear();
                command.Parameters.AddWithValue("@Id", item.Id);
                command.Parameters.AddWithValue("@Name", item.Name);
                command.Parameters.AddWithValue("@Value", item.Value);
                command.Parameters.AddWithValue("@Timestamp", item.Timestamp);

                // 執(zhí)行命令  
                command.ExecuteNonQuery();
            }
        }
    }
}

調(diào)用

using System.Data.SQLite;

namespace AppBigData
{
    internal class Program
    {

        static async Task Main(string[] args)
        
{
            Console.WriteLine("正在啟動(dòng)數(shù)據(jù)庫(kù)測(cè)試...");
            var processor = new AsyncDataProcessor("Data Source=large_database.db");
            var testData = GenerateTestData(50000);
            Console.WriteLine($"已生成 {testData.Count} 條測(cè)試記錄");
            try
            {
                Console.WriteLine("正在異步處理數(shù)據(jù)...");
                var startTime = DateTime.Now;
                await processor.ProcessLargeDataSetAsync(testData);
                var endTime = DateTime.Now;
                Console.WriteLine($"處理完成,耗時(shí) {(endTime - startTime).TotalSeconds:F2} 秒");
            }
            catch (AggregateException ex)
            {
                Console.WriteLine("處理過(guò)程中發(fā)生錯(cuò)誤:");
                foreach (var innerEx in ex.InnerExceptions)
                {
                    Console.WriteLine($"- {innerEx.Message}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"錯(cuò)誤: {ex.Message}");
            }

            Console.WriteLine("測(cè)試完成。按任意鍵退出。");
            Console.ReadKey();
        }

        privatestatic List<DataItem> GenerateTestData(int count)
        {
            var random = new Random();
            var items = new List<DataItem>();

            for (int i = 1; i <= count; i++)
            {
                items.Add(new DataItem
                {
                    Id = i,
                    Name = $"測(cè)試項(xiàng)目 {i}",
                    Value = (decimal)Math.Round(random.NextDouble() * 10002),
                    Timestamp = DateTime.Now.AddMinutes(-random.Next(01000))
                });
            }

            return items;
        }
    }
}

?

性能優(yōu)化建議 

  1. 使用事務(wù)批量處理數(shù)據(jù)
  2. 為常用查詢創(chuàng)建適當(dāng)?shù)乃饕?/span>
  3. 使用參數(shù)化查詢
  4. 分頁(yè)獲取大數(shù)據(jù)集
  5. 考慮使用異步和并行處理

注意事項(xiàng) 

  • SQLite對(duì)并發(fā)寫入支持有限
  • 大數(shù)據(jù)量時(shí)考慮分庫(kù)分表
  • 定期進(jìn)行數(shù)據(jù)庫(kù)維護(hù)和vacuum操作

結(jié)論 

通過(guò)合理運(yùn)用SQLite的特性和C#的高級(jí)特性,我們可以高效地處理大數(shù)據(jù)量,保證系統(tǒng)的性能和穩(wěn)定性。


這篇文章全面展示了在C#中使用SQLite處理大數(shù)據(jù)量的關(guān)鍵技術(shù)和最佳實(shí)踐。文章涵蓋了批量插入、分頁(yè)查詢、索引優(yōu)化和異步處理等重要技術(shù)點(diǎn)。


該文章在 2025/3/24 18:31:54 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产无套精品一区二区三区 | 国产一区二区高清在线 | 国产精品日韩av在自线在免费 | 国产视频一区二区三区四区 | 国产福利片无码区在线观看 | 国产亚洲日韩欧美 | 国产精品久av福利在线观看 | 国产人妻高清国产拍精品 | 精品一区二区国产在线观看 | av日韩国产一区二 | 国产福利麻豆精 | 国产高潮美女出白浆在线观看 | 91成人午夜在线精品 | 国内精品线在线观看 | av无码中文字幕不卡一二三区 | 99精品人妻无码专区在线视频 | av性爱专区久 | av无码国产在线观看免费软件 | 国产1卡二卡三卡入口 | 精品视频国产狼友视频 | 国产精品夜色一区二区三区 | 国产麻豆精品一区二区在线观看 | 18禁无遮挡羞羞污污污污免费 | 成人亚洲理论片在线观看 | 91久久精品人妻 | 国产性高清在线观看 | 91探花视频在线观看 | 东京热中文字幕a专区 | 国模无码一区二区三区在线观看 | 国产精品亚洲一区二区无码色 | 91精品国产成人综合 | 国产精品高清另类一区二区三区 | 国产av综合精品久久久久 | 91国内偷拍久久久 | 国产三级在线观看中文字幕 | 国产高清久久综合 | av三级在线观看免费天堂 | 国产成人a在线观看视频免费 | 国产日韩欧美不卡在线二区 | 国产成人香蕉久久久久 | 成人日韩高清 |