注意:例如我是C#开发人员,我使用.NET而不知道任何VB(当然WF 4.0使用VB语句,所以我拒绝任何涉及WF 4.0的项目:)).
总结I:感谢大家的回答.现在我可以告诉人们可以在不知道Java(语言)的情况下使用这些语言.现在我有另一个问题:如何从Java(JVM)生态系统开始?什么是初学者,中级和高级知识库(包!)?老实说Java生态系统对我来说总是有点混乱,因此为学习(曲线!)JVM提供一些"参考参考"和"defacto教程"会非常有帮助.(好的!我会把它作为另一个问题发布!)
是否存在一个公式/估计/感觉,根据文档种类数,每个文档的字段数和它们之间的关系数,向我们展示RavenDB数据库中索引的最佳数量是多少?
补充说明:
据我所知(第一)我们在RavenDB中查询索引,而不是文档和(第二)索引就像物化视图一样,因此它们可能会花费很多.我需要知道有多少索引会损害RavenDB在更新它们时的性能并使延迟太大而无法忽略?
由于Raven/MaxNumberOfParallelIndexTasks设置为当前计算机中的处理器数量,因此它意味着其他索引的索引过程将阻塞,直到当前索引任务结束?或者他们是一次又一次的部分更新?
使用SocketAsyncEventArgs开发TCP服务器,它是Windows服务的异步方法.我在Main的开头有这两行代码:
ThreadPool.SetMaxThreads(15000, 30000);
ThreadPool.SetMinThreads(10000, 20000);
Run Code Online (Sandbox Code Playgroud)
并且都返回true(记录返回值).现在2000到3000个客户端开始向此服务器发送消息,它开始接受连接(我计算连接数,它是预期的 - 有一个连接池).服务器进程的线程数将增长到~2050到~3050.到现在为止还挺好!
现在有一个Received方法,在ReceiveAsync返回true或SocketAsyncEventArgs的Completed事件后调用.
问题就此开始了:无论客户端连接多少以及发送的消息数量多少,接收的消息最多只能在一秒钟内调用20次!随着客户数量的增加,这个数字(20)下降到~10.
环境:TCP服务器和客户端正在同一台计算机上进行模拟.我在两台机器上测试了代码,一台有2核CPU和4GB RAM,另一台有8核CPU和12GB RAM.(还没有)数据丢失,有时我在每次接收操作中都会收到多条消息.没关系.但是如何才能增加接收操作的数量?
关于实现的附加说明:代码很大,包含许多不同的逻辑.总体描述如下:我有一个SocketAsyncEventArgs用于接受新连接.它很棒.现在,对于每个新接受的连接,我创建一个新的SocketAsyncEventArgs来接收数据.我把这个(为接收创建的SocketAsyncEventArgs)放在一个池中.它不会被重用,但它的UserToken被用于跟踪连接; 例如那些断开连接的连接或那些7分钟内没有发送任何数据的连接将被关闭和处理(SocketAsyncEventArgs的AcceptSocket将被关闭(两者),关闭和处理,SocketAsyncEventArgs对象本身也是如此).这是一个执行这些任务的Sudo类,但所有其他逻辑和日志记录以及错误检查和其他任何内容都被删除,以使其简单明了(也许更容易发现有问题的代码):
class Sudo
{
Socket _listener;
int _port = 8797;
public Sudo()
{
var ipEndPoint = new IPEndPoint(IPAddress.Any, _port);
_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
_listener.Bind(ipEndPoint);
_listener.Listen(100);
Accept(null);
}
void Accept(SocketAsyncEventArgs acceptEventArg)
{
if (acceptEventArg == null)
{
acceptEventArg = new SocketAsyncEventArgs();
acceptEventArg.Completed += AcceptCompleted;
}
else acceptEventArg.AcceptSocket = null;
bool willRaiseEvent = _listener.AcceptAsync(acceptEventArg); ;
if (!willRaiseEvent) Accepted(acceptEventArg);
}
void AcceptCompleted(object sender, SocketAsyncEventArgs e)
{
Accepted(e); …Run Code Online (Sandbox Code Playgroud) 每秒只有20条消息!这就是我得到的!这是从队列中查看50条消息并使用ReceiveById并行接收它们的代码.队列中的消息总数是500.我也测试了其他数字.但是上限是每秒20条消息!我在某处完全不受影响吗?
编辑1:
1 - 我需要队列可以恢复.但有趣的是,即使我将可恢复选项设置为false; 仍然是最高限制是20消息/秒.
2 - 我被迫在这里使用MSMQ,因为涉及一些遗留应用程序.但是如果这个代码是正确的并且这个前20个限制确实存在,我可以说服该组切换.因此,任何推荐(基于实际经验)的替换MSMQ都是非常受欢迎的(请注意,如果出现任何类型的失败,我们需要保留我们的消息).
3 - 我已经将ThreadPool中的线程数设置为一个高数字,以防它有所帮助但实际上在这段代码中它将导致创建100 - 200个线程.我已经测试了从50到10000的不同数字,没有差异.
4 - 在每个任务中创建一个新的MessageQueue,因为ReceiveById不是线程安全的.
5 - 正如人们在代码中看到的那样,消息大小非常低; 它只是一个字符串加一个int.
编辑2:[ 非常奇怪的新结果 ]
我已经玩了这段代码的每一点,发现了这个:如果我注释掉行singleLocal.UseJournalQueue = false; 在我的任务中,我每秒最多可以读取1200条消息.不是很令人印象深刻,但在我的情 奇怪的部分是UseJournalQueue的默认值为false; 为什么再将它设置为假应该在性能上有所不同?
static partial class Program
{
static void Main(string[] args)
{
ThreadPool.SetMaxThreads(15000, 30000);
ThreadPool.SetMinThreads(10000, 20000);
var qName = @".\private$\deep_den";
if (!MessageQueue.Exists(qName))
{
var q = MessageQueue.Create(qName);
}
var single = new MessageQueue(qName);
single.UseJournalQueue = false;
single.DefaultPropertiesToSend.AttachSenderId = false;
single.DefaultPropertiesToSend.Recoverable = true;
single.Formatter = new XmlMessageFormatter(new[] { typeof(Data) });
var count …Run Code Online (Sandbox Code Playgroud) C#struct是否是线程安全的?
例如,如果有:
struct Data
{
int _number;
public int Number { get { return _number; } set { _number = value; } }
public Data(int number) { _number = number; }
}
Run Code Online (Sandbox Code Playgroud)
在另一种类型:
class DadData
{
public Data TheData { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
是属性名为TheData,线程安全吗?
为什么默认值CreationOptions的Task使用产生Task.Run的DenyChildAttach,而不是None?
它有什么关系使工作与新async和await在C#5.0简单(防止你逃跑当前上下文我猜的电流调度)?
如何go fmt在保存时运行Visual Studio代码(或Go编程语言扩展)(或其他工具/命令)?甚至自动保存?
更新:此时 它正在VSCode中完美地工作; 只需要在.vscode目录中添加一些配置文件(我使用这些).
我想使用Emgu CV(或OpenCV)剪切图像的子图像(或裁剪它)并计算该部分的平均颜色; 寻找变化.
谢谢
c# ×8
performance ×2
.net ×1
async-await ×1
asynchronous ×1
c#-5.0 ×1
clojure ×1
concurrency ×1
emgucv ×1
f# ×1
gis ×1
go ×1
image ×1
java ×1
msmq ×1
nosql ×1
r-tree ×1
ravendb ×1
scala ×1
sockets ×1
struct ×1
threadpool ×1
windows ×1
wpf ×1
xps ×1