我有一个1M项目商店,List
我正在序列化以插入Redis.(2.8)
我将10
Tasks<>
每个部分的工作划分为自己的部分(List<>
对于readonly是线程安全的(在List上执行多个读取操作是安全的)
简化:
例:
因为 ITEMS=100
,THREADS=10
每个人Task
都会捕获自己的PAGE并处理相关范围.
对于exaple:
void Main() { var ITEMS=100; var THREADS=10; var PAGE=4; Listlst = Enumerable.Range(0,ITEMS).ToList(); for (int i=0;i< ITEMS/THREADS ;i++) { lst[PAGE*(ITEMS/THREADS)+i].Dump(); } }
PAGE=0
将处理: 0,1,2,3,4,5,6,7,8,9
PAGE=4
将处理: 40,41,42,43,44,45,46,47,48,49
一切都好.
现在回到SE.redis.
我想实现这种模式,所以我做了 :(有ITEMS=1,000,000
)
我的测试:
(这是dbsize
每秒检查):
如您所见,通过10个线程添加了1M记录.
现在,我不知道它是否很快但是,当我将ITEMS 1M
改为时10M
- 事情变得非常缓慢并且我得到例外:
for
循环中有例外.
未处理的异常:System.AggregateException:发生一个或多个错误.---
System.TimeoutException:在StackExchange.Redis上执行SET urn:user> 288257,inst:1,queu e:11,qu = 0,qs = 11,qc = 0,wr = 0/0,in = 0/0的超时. ConnectionMultiplexer.ExecuteSyncImpl [T](消息消息,ResultProcessor
1 processor, ServerEndPoint server) in c:\TeamCity\buildAgen t\work\58bc9a6df18a3782\StackExchange.Redis\StackExchange\Redis\ConnectionMultip lexer.cs:line 1722 at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProces sor
1处理器,ServerEndPoint服务器)位于c:\ TeamCity\buildAgent\work\58bc9a6df 18a3782\StackExchange.Redis\StackExchange\Redis\RedisBase.cs:第79行...... . 按任意键继续 ...
题:
我的分工方式是正确的方式(最快)
如何让事情变得更快(非常感谢示例代码)
我该如何解决此异常?
相关信息:
存在于App.config中(否则我得到outOfmemoryException),也 - 为x64bit构建,我有16GB,ssd驱动器,i7 cpu).