我有一个 1M 项目商店,List<Person>
我在其中进行序列化以便插入到 Redis。(2.8)
我将工作划分为10
Tasks<>
每个部分都有自己的部分(List<>
对于只读线程是安全的(在 List 上执行多个读取操作是安全的)
简化:
例子:
对于 ITEMS=100
, THREADS=10
, 每个Task
都会捕获自己的 PAGE 并处理相关范围。
例如:
void Main()
{
var ITEMS=100;
var THREADS=10;
var PAGE=4;
List<int> lst = 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:line 79 ... .. 。 按任意键继续 。. .
问题:
- 我的分工方式是正确的方式吗(最快)
- 我怎样才能更快地得到东西(示例代码将不胜感激)
- 如何解决此异常?
相关资料:
<gcAllowVeryLargeObjects enabled="true" />
存在于 App.config 中(否则我会出现 outOfmemoryException ),还 - 为 x64 位构建,我有 16GB ,,ssd 驱动器,i7 cpu)。