成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#中大數(shù)據(jù)列表的并行處理技術(shù)詳解

大數(shù)據(jù)
在實(shí)際應(yīng)用中,建議先進(jìn)行性能測(cè)試,根據(jù)數(shù)據(jù)量大小和處理復(fù)雜度選擇合適的實(shí)現(xiàn)方式。同時(shí)要注意異常處理和資源管理,確保程序的穩(wěn)定性和可靠性。

在處理大型數(shù)據(jù)集時(shí),單線程處理往往效率低下。通過將數(shù)據(jù)分割成多個(gè)小塊并利用多線程并行處理,我們可以顯著提高程序的性能。本文將詳細(xì)介紹幾種實(shí)現(xiàn)方式。

使用Parallel.ForEach進(jìn)行并行處理

最簡(jiǎn)單的實(shí)現(xiàn)方式是使用C#內(nèi)置的Parallel.ForEach方法。

namespace AppParallel
{
    internal class Program
    {
        static object lockObject = new object();
        static void Main(string[] args)
        {
            // 創(chuàng)建示例數(shù)據(jù)
            var largeList = Enumerable.Range(1, 1000000).ToList();

            // 設(shè)置并行選項(xiàng)
            var parallelOptions = new ParallelOptions
            {
                MaxDegreeOfParallelism = Environment.ProcessorCount // 使用處理器核心數(shù)量的線程
            };

            try
            {
                Parallel.ForEach(largeList, parallelOptions, (number) =>
                {
                    // 這里是對(duì)每個(gè)元素的處理邏輯
                    var result = ComplexCalculation(number);

                    // 注意:如果需要收集結(jié)果,要考慮線程安全
                    lock (lockObject)
                    {
                        // 進(jìn)行線程安全的結(jié)果收集
                        Console.WriteLine(result);
                    }
                });
            }
            catch (AggregateException ae)
            {
                // 處理并行處理中的異常
                foreach (var ex in ae.InnerExceptions)
                {
                    Console.WriteLine($"Error: {ex.Message}");
                }
            }
        }
        private static int ComplexCalculation(int number)
        {
            // 模擬復(fù)雜計(jì)算
            Thread.Sleep(100);
            return number * 2;
        }

    }
}

圖片圖片

手動(dòng)分塊處理方式

有時(shí)我們需要更精細(xì)的控制,可以手動(dòng)將數(shù)據(jù)分塊并分配給不同的線程。

namespace AppParallel
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var largeList = Enumerable.Range(1, 1000000).ToList();
            ProcessByChunks(largeList, 1000); // 每1000個(gè)元素一個(gè)塊
        }
        public static void ProcessByChunks<T>(List<T> largeList, int chunkSize)
        {
            // 計(jì)算需要多少個(gè)分塊
            int chunksCount = (int)Math.Ceiling((double)largeList.Count / chunkSize);
            var tasks = new List<Task>();

            for (int i = 0; i < chunksCount; i++)
            {
                // 獲取當(dāng)前分塊的數(shù)據(jù)
                var chunk = largeList
                    .Skip(i * chunkSize)
                    .Take(chunkSize)
                    .ToList();

                // 創(chuàng)建新任務(wù)處理當(dāng)前分塊
                var task = Task.Run(() => ProcessChunk(chunk));
                tasks.Add(task);
            }

            // 等待所有任務(wù)完成
            Task.WaitAll(tasks.ToArray());
        }

        private static void ProcessChunk<T>(List<T> chunk)
        {
            foreach (var item in chunk)
            {
                // 處理每個(gè)元素
                ProcessItem(item);
            }
        }

        private static void ProcessItem<T>(T item)
        {
            // 具體的處理邏輯
            Console.WriteLine($"Processing item: {item} on thread: {Task.CurrentId}");
        }

    }
}

圖片圖片

使用生產(chǎn)者-消費(fèi)者模式

對(duì)于更復(fù)雜的場(chǎng)景,我們可以使用生產(chǎn)者-消費(fèi)者模式,這樣可以更好地控制內(nèi)存使用和處理流程。

public class ProducerConsumerExample
{
    private readonly BlockingCollection<int> _queue;
    private readonly int _producerCount;
    private readonly int _consumerCount;
    private readonly CancellationTokenSource _cts;

    public ProducerConsumerExample(int queueCapacity = 1000)
    {
        _queue = new BlockingCollection<int>(queueCapacity);
        _producerCount = 1;
        _consumerCount = Environment.ProcessorCount;
        _cts = new CancellationTokenSource();
    }

    public async Task ProcessDataAsync(List<int> largeList)
    {
        // 創(chuàng)建生產(chǎn)者任務(wù)
        var producerTask = Task.Run(() => Producer(largeList));

        // 創(chuàng)建消費(fèi)者任務(wù)
        var consumerTasks = Enumerable.Range(0, _consumerCount)
            .Select(_ => Task.Run(() => Consumer()))
            .ToList();

        // 等待所有生產(chǎn)者完成
        await producerTask;

        // 標(biāo)記隊(duì)列已完成
        _queue.CompleteAdding();

        // 等待所有消費(fèi)者完成
        await Task.WhenAll(consumerTasks);
    }

    private void Producer(List<int> items)
    {
        try
        {
            foreach (var item in items)
            {
                if (_cts.Token.IsCancellationRequested)
                    break;

                _queue.Add(item);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Producer error: {ex.Message}");
            _cts.Cancel();
        }
    }

    private void Consumer()
    {
        try
        {
            foreach (var item in _queue.GetConsumingEnumerable())
            {
                if (_cts.Token.IsCancellationRequested)
                    break;

                // 處理數(shù)據(jù)
                ProcessItem(item);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Consumer error: {ex.Message}");
            _cts.Cancel();
        }
    }

    private void ProcessItem(int item)
    {
        // 具體的處理邏輯
        Thread.Sleep(100); // 模擬耗時(shí)操作
        Console.WriteLine($"Processed item {item} on thread {Task.CurrentId}");
    }
}

// 使用示例
static async Task Main(string[] args)
{
    var processor = new ProducerConsumerExample();
    var largeList = Enumerable.Range(1, 10000).ToList();
    await processor.ProcessDataAsync(largeList);
}

圖片圖片

注意事項(xiàng)

  1. 合適的分塊大小

a.分塊不要太小,否則線程切換開銷會(huì)抵消并行處理的優(yōu)勢(shì)

b.也不要太大,否則會(huì)影響負(fù)載均衡

c.建議從1000-5000個(gè)元素每塊開始測(cè)試

  1. 異常處理

a.務(wù)必妥善處理并行處理中的異常

b.使用try-catch包裝每個(gè)任務(wù)

c.考慮使用CancellationToken來優(yōu)雅終止所有任務(wù)

  1. 資源管理

a.注意內(nèi)存使用,避免同時(shí)加載過多數(shù)據(jù)

b.合理控制線程數(shù)量,通常不超過處理器核心數(shù)的2倍

c.使用using語句管理IDisposable資源

  1. 線程安全

a.訪問共享資源時(shí)確保使用適當(dāng)?shù)耐綑C(jī)制

b.考慮使用線程安全的集合類

c.避免過度鎖定導(dǎo)致性能下降

總結(jié)

并行處理大數(shù)據(jù)列表是提高程序性能的有效方式,但需要根據(jù)具體場(chǎng)景選擇合適的實(shí)現(xiàn)方式。本文介紹的三種方法各有特點(diǎn):

  • Parallel.ForEach: 適合簡(jiǎn)單場(chǎng)景,實(shí)現(xiàn)簡(jiǎn)單
  • 手動(dòng)分塊處理:提供更多控制,適合中等復(fù)雜度場(chǎng)景
  • 生產(chǎn)者-消費(fèi)者模式:適合復(fù)雜場(chǎng)景,可以更好地控制資源使用

在實(shí)際應(yīng)用中,建議先進(jìn)行性能測(cè)試,根據(jù)數(shù)據(jù)量大小和處理復(fù)雜度選擇合適的實(shí)現(xiàn)方式。同時(shí)要注意異常處理和資源管理,確保程序的穩(wěn)定性和可靠性。

責(zé)任編輯:武曉燕 來源: 技術(shù)老小子
相關(guān)推薦

2010-04-07 14:22:46

2009-09-02 18:52:38

Oracle數(shù)據(jù)庫并行

2020-12-31 11:49:13

大數(shù)據(jù)大數(shù)據(jù)應(yīng)用

2024-02-23 09:36:57

C#工具并行處理

2016-02-16 14:30:00

HadoopDoug Cuttin大數(shù)據(jù)

2024-04-03 00:10:24

C#System數(shù)據(jù)

2024-04-03 00:06:03

2010-04-09 14:48:41

Oracle數(shù)據(jù)庫

2010-04-09 14:37:08

Oracle數(shù)據(jù)庫

2024-05-06 00:00:00

C#序列化技術(shù)

2024-09-18 00:00:02

反射C#元數(shù)據(jù)

2024-07-03 08:15:39

C#字符串表達(dá)式

2009-09-02 18:34:28

C#鼠標(biāo)事件

2025-04-30 01:50:00

C#異步編程

2015-12-18 15:06:58

2012-09-17 13:44:16

架構(gòu)數(shù)據(jù)

2009-01-19 10:26:02

C#Namespace.NET

2009-08-31 16:47:39

C#接口的定義

2021-03-26 09:49:22

架構(gòu)并行處理

2013-04-27 16:44:54

大數(shù)據(jù)大數(shù)據(jù)全球技術(shù)峰會(huì)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 综合在线视频 | 九九热精品在线视频 | 欧洲成人午夜免费大片 | 久久福利网站 | 欧美日韩久久 | 欧美又大粗又爽又黄大片视频 | 天天操天天摸天天爽 | 日本一区二区三区精品视频 | 亚洲午夜精品一区二区三区他趣 | 精品国产精品一区二区夜夜嗨 | 国产色在线 | 国产午夜精品一区二区三区 | 欧美精品网站 | 久久一区二区三区四区五区 | 中文字幕国产高清 | 国产一区二区久久 | 免费精品视频一区 | 精品亚洲一区二区 | 久在线| 天天干天天操天天看 | 欧美影院| 国产精品视频久久 | 日韩视频三区 | 国产午夜精品视频 | 欧美二区在线 | 在线91 | 91视频免费观看 | 免费久久网站 | www.成人久久 | 午夜色播 | 国产一区www | 啪啪精品| 国产精品麻 | 久久99精品久久久久婷婷 | 国产一区二区三区不卡av | 天堂一区二区三区 | 国产91在线视频 | 香蕉视频在线播放 | 久久久综合精品 | 红桃成人在线 | 欧美综合一区二区三区 |