C#大数据量问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#大数据量问题相关的知识,希望对你有一定的参考价值。
很多时候程序需要处理大数据量,我们一般采用一个进度条来显示处理进度,以表示界面的友好以及让用户不用那么一直等待.
但是用户在等待的过程中如果随便点击了界面,那么界面就马上会变白,造成程序死了的家乡,其实还在运行,只是界面死了.有没有很好的办法,让用户随便点,但是界面不是.
以上整个的效果就和我们安装一个程序的时候,安装进度的功能.我们随便怎么点界面,界面是不会死的,是如何实现的?
我知道用线程,但是我试过,使用了一个现成来处理数据.还是一样界面死掉.
我目前的思路:按钮事件启动一个无限循环的线程.
下面是转载的别人的,这样的资料太多了,其实仔细看看资料,其实很简单。
参考资料里面的内容很详细。
一、线程简介
通常C# 程序具有一个线程。这个线程从 Main方法的执行开始启动到Main方法的执行结束时线程终止。Main 直接或间接执行的每一个命令都由默认线程(或主线程)执行,当 Main 返回时此线程也将终止。不过,可以创建辅助线程,以便与主线程一起并行执行代码。这些线程通常称为“辅助线程”。
辅助线程可以用于执行耗时较多的任务或时间要求紧迫的任务,而不必占用主线程。例如,辅助线程经常用在服务器应用程序中,以便无需等待前面的请求完 成即可响应传入的请求。辅助线程还可用于在桌面应用程序中执行“后台”任务,以便使主线程(用于驱动用户界面元素)保持对用户操作的响应。
多线程处理解决了吞吐量和响应性的问题,但同时也带来了资源共享问题,如死锁和争用状态。多线程特别适用于需要不同资源(如文件句柄和网络连接)的任务。为单个资源分配多个线程可能会导致同步问题,线程会被频繁阻止以等待其他线程,从而与使用多线程的初衷背道而驰。
常见的策略是使用辅助线程执行不需要大量占用其他线程所使用的资源的、耗时较多的任务或时间要求紧迫的任务。实际上,程序中的某些资源必须由多个线程访问。考虑到这些情况,System.Threading 命名空间提供了用于同步线程的类。这些类包括 Mutex、Monitor、Interlocked、AutoResetEvent 和 ManualResetEvent。
您可以使用这些类中的部分或所有类来同步多个线程的活动,但是某些多线程处理支持由 C# 语言提供。例如,C# 中的 Lock 语句通过隐式使用 Monitor 来提供同步功能。
二、线程的生命周期
三、与线程有关的类
与C#有关的类都在System.Threading命名空间中, System.Threading 命名空间提供一些使得可以进行多线程编程的类和接口。除同步线程活动和访问数据的类(Mutex、Monitor、Interlocked、AutoResetEvent 等)外,此命名空间还包含一个 ThreadPool 类(它允许用户使用系统提供的线程池)和一个 Timer 类(它在线程池线程上执行回调方法)。
1. Thread: 创建并控制线程,设置其优先级并获取其状态。其中最常用的几个方法如下:
Sleep():将当前线程阻塞指定的毫秒数。
Abort():在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。
Join():阻塞调用线程,直到某个线程终止时为止。
Start():使线程得以按计划执行。
注意Suspend()为挂起线程和Resume()为继续挂起的线程,这两个方法存在风险,所以不建议使用。具体请参照MS的相关文档
Thread类的常用属性如下:
CurrentThread: 获取当前正在运行的线程。
IsAlive: 获取一个值,该值指示当前线程的执行状态。
Name: 获取或设置线程的名称
Priority:获取或设置一个值,该值指示线程的调度优先级。
ThreadState:获取一个值,该值包含当前线程的状态。
2. ThreadPool:提供一个线程池,该线程池可用于发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。
BindHandle:将操作系统句柄绑定到 ThreadPool。
GetAvailableThreads:检索由 GetMaxThreads 方法返回的最大线程池线程数和当前活动线程数之间的差值。
GetMaxThreads: 检索可以同时处于活动状态的线程池请求的数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用
GetMinThreads: 检索线程池在新请求预测中维护的空闲线程数。
QueneUserWorkItem: 将方法排入队列以便执行。此方法在有线程池线程变得可用时执行。
RegisterWaitForSingleObject: 注册正在等待 WaitHandle 的委托。
UnsafeQueueUserWorkItem: 注册一个等待 WaitHandle 的委托。
SetMaxThreads: 设置可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。
四、示例及其说明
using System;
using System.Threading;
public class Worker
// 在线程启动时此方法将被调用
public void DoWork()
while (!_shouldStop) // 如果线程正在运行则打印信息
Console.WriteLine("worker thread: working...");
Console.WriteLine("worker thread: terminating gracefully.");
public void RequestStop()
_shouldStop = true;
// Volatile这个关键字用来提醒编译器这个数据成员将被多线程访问
private volatile bool _shouldStop; // 应该停止
public class Program
static void Main()
// 创建一个线程对象. 这里并不是线程的开始
Worker workerObject = new Worker();
// 这里定义一个新的线程,注意这里没有使用ThreadStart委托
// 另外构造函数接受的是对象的方法的名称
Thread workerThread = new Thread(workerObject.DoWork);
// 这里才是线程的真正开始
workerThread.Start();
Console.WriteLine("主线程: worker线程开始...");
// 循环直到线程被激活,Thread的IsAlive这个属性表示线程是否为活动的
while (!workerThread.IsAlive);
// 将主线程暂停1毫秒,以允许worker这个线程完成自己的工作
Thread.Sleep(1);
// 需要worker这个线程自动停止
workerObject.RequestStop();
// 使用Join这个方法来阻塞当前线程,直到对象的线程终止 workerThread.Join();
Console.WriteLine("main thread: Worker thread has terminated.");
参考资料:http://blog.csdn.net/csuliky/archive/2008/11/19/3331426.aspx
参考技术A 1、逐行读取(这样内存消耗较小)2、将读取的结果存入Dictionary<key,value>类型中。
3、存入Dictionary<key,value>前先判断是否存在。
string value = "21001221110011";
if (openWith.TryGetValue("21001221110011", out value))
//存在的处理
else
//不存在的处理
字典的效率比较高,查询时间是O(1)。 参考技术B 可以采用多线程实现
pinpoint 单机HBASE数据量过大问题解决
Pinpoint接入业务监控后数据量大涨,平均每周Hbase数据增量25G左右,数据量太大,需要对数据进行定期清理,否则监控可用性降低。
操作步骤
查找出数据大的hbase表
[root@iZ28ovlz7ccZ worker]# du -sh hbase/data/default/* 2.2M hbase/data/default/AgentEvent 348K hbase/data/default/AgentInfo 2.6M hbase/data/default/AgentLifeCycle 329M hbase/data/default/AgentStatV2 34M hbase/data/default/ApiMetaData 44K hbase/data/default/ApplicationIndex 66M hbase/data/default/ApplicationMapStatisticsCallee_Ver2 60M hbase/data/default/ApplicationMapStatisticsCaller_Ver2 16M hbase/data/default/ApplicationMapStatisticsSelf_Ver2 1.1M hbase/data/default/ApplicationStatAggre 1.1G hbase/data/default/ApplicationTraceIndex 976K hbase/data/default/HostApplicationMap_Ver2 15M hbase/data/default/SqlMetaData_Ver2 848K hbase/data/default/StringMetaData 21G hbase/data/default/TraceV2
24小时产生数据大概20G,发现其中TraceV2及ApplicationTraceIndex数据比较大,设置TTL分别为7Day及14Day
进入hbase修改表ttl
[root@iZ28ovlz7ccZ ~]# /usr/local/hbase-1.0.3/bin/hbase shell 2019-08-19 15:43:20,320 WARN [main] util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable hbase(main):002:0> list TABLE AgentEvent AgentInfo AgentLifeCycle AgentStatV2 ApiMetaData ApplicationIndex ApplicationMapStatisticsCallee_Ver2 ApplicationMapStatisticsCaller_Ver2 ApplicationMapStatisticsSelf_Ver2 ApplicationStatAggre ApplicationTraceIndex HostApplicationMap_Ver2 SqlMetaData_Ver2 StringMetaData TraceV2 15 row(s) in 0.0100 seconds => ["AgentEvent", "AgentInfo", "AgentLifeCycle", "AgentStatV2", "ApiMetaData", "ApplicationIndex", "ApplicationMapStatisticsCallee_Ver2", "ApplicationMapStatisticsCaller_Ver2", "ApplicationMapStatisticsSelf_Ver2", "ApplicationStatAggre", "ApplicationTraceIndex", "HostApplicationMap_Ver2", "SqlMetaData_Ver2", "StringMetaData", "TraceV2"] hbase(main):004:0> describe ‘TraceV2‘ Table TraceV2 is ENABLED TraceV2 COLUMN FAMILIES DESCRIPTION {NAME => ‘S‘, BLOOMFILTER => ‘ROW‘, VERSIONS => ‘1‘, IN_MEMORY => ‘false‘, KEEP_DELETED_CELLS => ‘FALSE‘, DATA_BLOCK_ENCODING => ‘PREFIX‘, TTL => ‘5184000 SECONDS ( 60 DAYS)‘, COMPRESSION => ‘NONE‘, MIN_VERSIONS => ‘0‘, BLOCKCACHE => ‘true‘, BLOCKSIZE => ‘65536‘, REPLICATION_SCOPE => ‘0‘} 1 row(s) in 0.1190 seconds hbase(main):005:0> disable ‘TraceV2‘ 0 row(s) in 4.2190 seconds hbase(main):006:0> alter ‘TraceV2‘ , {NAME=>‘S‘,TTL=>‘604800‘} Updating all regions with the new schema... 256/256 regions updated. Done. 0 row(s) in 1.0980 seconds hbase(main):009:0> enable ‘TraceV2‘ 0 row(s) in 4.2370 seconds hbase(main):010:0> describe ‘TraceV2‘ Table TraceV2 is ENABLED TraceV2 COLUMN FAMILIES DESCRIPTION {NAME => ‘S‘, BLOOMFILTER => ‘ROW‘, VERSIONS => ‘1‘, IN_MEMORY => ‘false‘, KEEP_DELETED_CELLS => ‘FALSE‘, DATA_BLOCK_ENCODING => ‘PREFIX‘, TTL => ‘604800 SECONDS (7 DAYS)‘, COMPRESSION => ‘NONE‘, MIN_VERSIONS => ‘0‘, BLOCKCACHE => ‘true‘, BLOCKSIZE => ‘65536‘, REPLICATION_SCOPE => ‘0‘} 1 row(s) in 0.0160 seconds hbase(main):002:0> describe ‘TraceV2‘ Table TraceV2 is ENABLED TraceV2 COLUMN FAMILIES DESCRIPTION {NAME => ‘S‘, BLOOMFILTER => ‘ROW‘, VERSIONS => ‘1‘, IN_MEMORY => ‘false‘, KEEP_DELETED_CELLS => ‘FALSE‘, DATA_BLOCK_ENCODING => ‘PREFIX‘, TTL => ‘5184000 SECONDS (60 DAYS)‘, COMPRESSION => ‘NONE‘, MIN_VERSIONS => ‘0‘, BLOCKCACHE => ‘true‘, BLOCKSIZE => ‘65536‘, REPLICATION_SCOPE => ‘0‘} 1 row(s) in 0.1000 seconds
设置ApplicationTraceIndex的TTL为 14天
hbase(main):011:0> describe ‘ApplicationTraceIndex‘ Table ApplicationTraceIndex is ENABLED ApplicationTraceIndex COLUMN FAMILIES DESCRIPTION {NAME => ‘I‘, BLOOMFILTER => ‘ROW‘, VERSIONS => ‘1‘, IN_MEMORY => ‘false‘, KEEP_DELETED_CELLS => ‘FALSE‘, DATA_BLOCK_ENCODING => ‘PREFIX‘, TTL => ‘5184000 SECONDS ( 60 DAYS)‘, COMPRESSION => ‘NONE‘, MIN_VERSIONS => ‘0‘, BLOCKCACHE => ‘true‘, BLOCKSIZE => ‘65536‘, REPLICATION_SCOPE => ‘0‘} 1 row(s) in 0.0150 seconds hbase(main):012:0> disable ‘ApplicationTraceIndex‘ 0 row(s) in 1.1660 seconds hbase(main):013:0> alter ‘ApplicationTraceIndex‘ , {NAME=>‘I‘,TTL=>‘1209600‘} Updating all regions with the new schema... 16/16 regions updated. Done. 0 row(s) in 1.0550 seconds hbase(main):014:0> enable ‘ApplicationTraceIndex‘ 0 row(s) in 0.3520 seconds hbase(main):015:0> describe ‘ApplicationTraceIndex‘ Table ApplicationTraceIndex is ENABLED ApplicationTraceIndex COLUMN FAMILIES DESCRIPTION {NAME => ‘I‘, BLOOMFILTER => ‘ROW‘, VERSIONS => ‘1‘, IN_MEMORY => ‘false‘, KEEP_DELETED_CELLS => ‘FALSE‘, DATA_BLOCK_ENCODING => ‘PREFIX‘, TTL => ‘1209600 SECONDS ( 14 DAYS)‘, COMPRESSION => ‘NONE‘, MIN_VERSIONS => ‘0‘, BLOCKCACHE => ‘true‘, BLOCKSIZE => ‘65536‘, REPLICATION_SCOPE => ‘0‘} 1 row(s) in 0.0200 seconds hbase(main):016:0> major_compact ‘ApplicationTraceIndex‘ 0 row(s) in 0.1660 seconds
备注
major_compact的操作目的
合并文件
清除删除、过期、多余版本的数据
提高读写数据的效率
604800 7day
describe ‘TraceV2‘
disable ‘TraceV2‘
alter ‘TraceV2‘ , {NAME=>‘S‘,TTL=>‘604800‘}
enable ‘TraceV2‘
describe ‘TraceV2‘
major_compact ‘TraceV2‘
1209600 14day
describe ‘ApplicationTraceIndex‘
disable ‘ApplicationTraceIndex‘
alter ‘ApplicationTraceIndex‘ , {NAME=>‘I‘,TTL=>‘1209600‘}
enable ‘ApplicationTraceIndex‘
describe ‘ApplicationTraceIndex‘
major_compact ‘ApplicationTraceIndex‘
[root@iZ28ovlz7ccZ ~]# du -sh /worker/hbase/data/* 14G /worker/hbase/data/default 348K /worker/hbase/data/hbase
以上是关于C#大数据量问题的主要内容,如果未能解决你的问题,请参考以下文章