小编Ron*_*dau的帖子

在一段代码中将GC置于保持状态

有没有办法让GC完全保留一段代码?我在其他类似问题中找到的唯一的事情是GC.TryStartNoGCRegion它只限于你指定的内存量本身仅限于短暂段的大小.

有没有办法完全绕过它并告诉.NET "分配你需要的任何东西,不做GC期间"或增加段的大小?从我发现它在许多核心服务器上最多1GB,这比我需要分配的少,但我不希望GC发生(我有多达TB的空闲RAM,并且有数千个GC峰值在那一节中,我非常乐意将这些内容换成RAM使用量的10倍甚至100倍.

编辑:

现在有了赏金,我认为如果我指定用例就更容易了.我正在使用LINQ to XML加载和解析一个非常大的XML文件(现在1GB,很快就会12GB)到内存中的对象.我不是在寻找替代方案.我正在创建数以百万计的数百万个小对象,XElements并且GC正试图不间断地收集,而我很高兴保持所有RAM用完.我有100英镑的内存,一旦它达到4GB使用,GC开始收集不间断,这是非常友好的内存,但性能不友好.我不关心记忆但我关心表现.我想采取相反的权衡.

虽然我不能在这里发布实际代码是一些非常接近最终代码的示例代码,可以帮助那些要求更多信息的人:

var items = XElement.Load("myfile.xml")
.Element("a")
.Elements("b") // There are about 2 to 5 million instances of "b"
.Select(pt => new
{
    aa = pt.Element("aa"),
    ab = pt.Element("ab"),
    ac = pt.Element("ac"),
    ad = pt.Element("ad"),
    ae = pt.Element("ae")
})
.Select(pt => new 
{
    aa = new
    {
        aaa = double.Parse(pt.aa.Attribute("aaa").Value),
        aab = double.Parse(pt.aa.Attribute("aab").Value),
        aac = double.Parse(pt.aa.Attribute("aac").Value),
        aad = double.Parse(pt.aa.Attribute("aad").Value),
        aae = double.Parse(pt.aa.Attribute("aae").Value)
    },
    ab = new
    {
        aba = …
Run Code Online (Sandbox Code Playgroud)

.net c# garbage-collection .net-4.6

17
推荐指数
1
解决办法
495
查看次数

HttpListener:根据内容写入输出流速度慢?

删除了旧问题并完全重写,因为我已经在这方面做了很多工作来查明问题.我的问题是我正在编写一个带有自定义服务器的自定义CMS,以非常高的速度/吞吐量为目标,但是我注意到某些数据或数据模式会导致严重的减速(从0到55 + ms响应)时间).我真的需要一个比我更好的帮助,因为我对发生的事情一无所知,我怀疑.net框架中的一个错误,但我不知道它可能在哪里,一点点.net代码浏览我没有建议输出Stream做任何数据特定的事情

我测试过的东西肯定不是问题所在:

  • 内容的大小(更大的内容更快)
  • 内容的类型(相同内容类型之间的差异)
  • 大多数周围的代码(做了一个简单的项目来重现bug,站在大约15行,找到帖子底部的链接,包括重现它的数据,运行它,用2个URL测试,自己看看).
  • 不是网页/缓存等问题,在Firefox中使用单个图像和CTRL + F5重现问题,删除图像的最后几个字节会在100%的时间内修复它,将它们添加回来会再次导致问题
  • 不是输出流之外存在的问题(用目标内存流替换它不会显示问题)

如何重现问题:

  • 下载并运行该项目
  • 使用您最喜欢的浏览器并转到localhost:8080/magicnumber
  • 用你想要的东西替换那个url中的magicnumber,你将收到的图像减去那个字节数

我的结果:

  • 该图像恒定50ms左右
  • 将幻数提高到1000并不会对此产生任何影响
  • 更进一步(我认为大概是1080 ish?)它突然下降到0MS
  • 不知道发生了什么,但似乎每个请求至少有两个请求,至少在Firefox中使用CTRL + F5时,正确的情况下都是0ms,在错误的情况下,第一个仍然是0ms,但另一个变为50ms,我是假设第一个只是检查文件缓存是否正常我还在回答但是Firefox关闭连接还是什么?

任何帮助都非常感谢,把我所有的代表放在Bounty上,因为我真的需要知道我是否沿着这条路走下去/得到更多信息来报告这个或者如果我走低层并做我自己的http.sys互操作(并且,大多数总之,如果bug只在.net端或更低级别上,那么更低级别将无法修复它!)

示例文件是一个gziped数组,我的内容预先缓存并在db中预压缩,因此这代表了我需要发送的数据.

https://www.dropbox.com/s/ao63d7din939new/StackOverFlowSlowServerBug.zip

编辑:如果我有小提琴打开,有问题的测试回到0毫秒,我不知道该怎么做它到目前为止这意味着我正在得到一个主要的减速,当发送一些数据,这是没有定义的数据类型,但实际数据,如果我之间有小提琴,这不会发生.我很丢失!

编辑2:用另一个浏览器测试只是为了确定,实际上它在IE上回到0ms所以我假设它可能实际上不是HttpListener错误而是Firefox错误,我将编辑我的问题和标签,如果没有一个建议不然.如果是这种情况,任何人都知道我应该在哪里查看FF的代码来理解这个问题?(它肯定是一个问题,即使在他们一边,因为我再次比较2个文件,一个比另一个大,相同的文件格式,最大的一个总是需要0ms,最小的一个总是55ms!)

.net c# stream httplistener

16
推荐指数
1
解决办法
961
查看次数

带有gcAllowVeryLargeObjects的OutOfMemoryException

我正在使用BinarySerializer,它有一个非常大的(尽管不是很深)项目图.我有8GB的ram支持12Gig的交换,并且在序列化时我得到一个OutOfMemoryException,这是预期的(图表可能接近或超过2Gb).

然而,当我使用gcAllowVeryLargeObjects它并不是更好,我仍然得到相同的异常,我肯定在应该保留在内存中的东西(至少与交换).

有什么我可以做的来支持序列化这个/一种方法来获得相同的功能集,但可能会得到结果?

我的序列化代码没有什么特别之处:

    public static byte[] Serialize(this object o)
    {
        var ms = new MemoryStream();
        var bf = new BinaryFormatter();
        bf.Serialize(ms, o);
        ms.Position = 0;
        return ms.ToArray();
    }
Run Code Online (Sandbox Code Playgroud)

我正在序列化的对象包含自身包含数组等的项目数组,但完整的图形本身并不"大"(这是索引数据的结果,在源处,已经只有大约1GB的大小).

这不是由于GC碎片造成的(压缩大堆没有帮助).

.net c# out-of-memory .net-4.5 gcallowverylargeobjects

14
推荐指数
1
解决办法
9705
查看次数

为什么本地数组比静态读取/写入更快?

我正在编写一些基准测试来弄清楚为什么类似的纯算法(在类中没有C++ lib/.net)在C++中比在C#中运行得快得多,即使在考虑预期的特征差异时也是如此.虽然这样做我偶然发现了令我感到困惑的这两项测试,但是有没有人知道为什么一个人比另一个慢得多?第二个(在我的机器上需要51毫秒vs 88)的唯一区别是2个数组在方法中而不是在外部声明.在这两种情况下,数组都是在开始计时之前创建的.

    const int Runs = 100;
    const int Width = 5000;
    const int Height = 5000;
    const int Size = Width * Height;


    static int[] Input = Enumerable.Range(0, Size).ToArray();
    static int[] Output = new int[Size * 2];

    static int SimpleTest()
    {
        // Removing those 2 lines and using the static arrays instead give substantially slower performance, nearly half the speed!
        int[] Input = Enumerable.Range(0, Size).ToArray();
        int[] Output = new int[Size * 2];

        Stopwatch sw = new Stopwatch();
        sw.Start(); …
Run Code Online (Sandbox Code Playgroud)

c# arrays performance

14
推荐指数
2
解决办法
2003
查看次数

使用 MapFallbackToController 端点在本地与 iis express & kestrel 一起工作,在 IIS 上使用回退而不是更高优先级的路由

在从 .net core 2.2 切换到 3.0,然后在本地切换到 3.1 之后,我们切换到端点路由。我有以下路线:

app.UseEndpoints(endpoints =>
        {
            // Using this for asp.net core identity
            endpoints.MapRazorPages();
            // Mapping 2 routes, one private, one public but that we don't want localized so in both cases was simpler to create an area
            endpoints.MapAreaControllerRoute("Back", "Back", "back/{controller=Home}/{action=Index}/{id?}");
            endpoints.MapAreaControllerRoute("Photo", "Photo", "photo/{controller=Photo}/{action=Index}/{id?}");
            // The default mapping for our front office, this works just fine in iis express
            endpoints.MapControllerRoute("default", "{lang:lang}/{controller=Home}/{action=Index}/{id?}");
            // Fallback is used mainly to redirect you from / to /defaultlanguage
            endpoints.MapFallbackToController("WrongEndpoint","Home");
        }); …
Run Code Online (Sandbox Code Playgroud)

c# iis kestrel-http-server asp.net-core

10
推荐指数
0
解决办法
1119
查看次数

是否可以将HTTP2与HTTPListener一起使用

是否可以将HTTP2功能与HTTPListeners一起使用?我没有听到任何关于它的消息,但我听说IIS/asp.net堆栈的新版本支持它,所以我希望HTTPListener也会被ugpraded或者提供替代方案.

如果没有什么是支持http2的最佳选择,使用原始套接字还是可以扩展httplistener?

编辑:澄清我不只是在寻找一个"报告"http2的解决方案,而是一个能让我实际使用http2新功能的解决方案,例如推送内容,我的用例是我有一个自定义CMS(自编写)服务器是极低的延迟(立即回复所有请求),唯一剩下的就是能够推送内容并能够多路复用,因为目前唯一可以实现的加速是避免来自这么多的rountrips的延迟

.net httplistener http2

8
推荐指数
1
解决办法
897
查看次数

在模型设计器中使用强空间类型选项锁定?

我正在以模型第一种方法开发模型第一个EF6模型.

EF暴露的不仅仅是DBGeometry和DBGeography,还允许我在设计模型时选择特定的子类型(如GeographyPoint).

但是,即使我选择了更具体的子类型,我生成的类仍然只是DBGeography.

我注意到模型上的一个名为"使用强空间类型"的属性,但默认设置为false并且似乎已锁定(灰色,没有下拉列表,无法键入).这似乎意味着支持生成更强大的类型化的类(例如,在生成的类中将使用GeographyPoint而不是DBGeography)

知道是什么原因引起的吗?这听起来像一个有用的功能.

我的目标是SQL Server Express 2012,如果这是一个问题,我可以切换到另一个版本,因为我没有做任何特定的版本.

更新:如果你不确定你理解我所指的是什么,请参见图片链接!

https://www.dropbox.com/s/lzgsoi60whuicy0/EF%20Spacial%20Strong.png?dl=0

在此输入图像描述

sql-server entity-framework .net-4.5 ef-model-first entity-framework-6

7
推荐指数
1
解决办法
863
查看次数

如何在OpenCVSharp代码中使用新的C++样式API?

我正在使用OpenCVSharp,但目前我的一半代码在C中,另一半在C++ API中,我试图将它全部移植到C++版本以避免弃用的API以及避免加载图像两次(分享Mat而不是每个图像一个Mat和一个CvMat)

这是我的代码:

            CvMat distortion = new CvMat(8, 1, MatrixType.F64C1);
            distortion[0, 0] = camera.CameraConfig.k1;
            distortion[1, 0] = camera.CameraConfig.k2;
            distortion[2, 0] = camera.CameraConfig.p1;
            distortion[3, 0] = camera.CameraConfig.p2;
            distortion[4, 0] = camera.CameraConfig.k3;
            distortion[5, 0] = 0;
            distortion[6, 0] = 0;
            distortion[7, 0] = 0;

            CvMat intrinsic = new CvMat(3, 3, MatrixType.F32C1);
            intrinsic[0, 0] = camera.CameraConfig.fx;
            intrinsic[0, 1] = camera.CameraConfig.skew;
            intrinsic[0, 2] = camera.CameraConfig.cx;
            intrinsic[1, 0] = 0;
            intrinsic[1, 1] = camera.CameraConfig.fy;
            intrinsic[1, 2] = camera.CameraConfig.cy;
            intrinsic[2, …
Run Code Online (Sandbox Code Playgroud)

c# opencv opencvsharp

7
推荐指数
1
解决办法
738
查看次数

当文档发生变化时,在postsharp [Command]上触发"CanExecute"?

我目前正在将一个项目迁移到PostSharp以删除大量样板代码,其中大部分代码都非常顺利,但我对如何强制命令重新检查它感到困惑CanExecute.我预计PostSharp将检查命令,就像检查依赖关系一样,这里是一个极简主义的样本

[NotifyPropertyChanged]
public class MyWindowViewModel
{
    /// Anything bound to this refreshes just fine as expected
    public ObservableCollection<SomeType> Documents = new ObservableCollection<SomeType>();

   [Command]
   public ICommand AddDocumentCommand { get; set; }
   public void ExecuteAddDocument () { Documents.Add(new SomeType()); }

   [Command]
   public ICommand CloseDocumentCommand { get; set; }
   public bool CanExecuteCloseDocument () => Documents.Any(); 
   public void ExecuteCloseDocument () { Documents.Remove(Documents.Last()); }        
}
Run Code Online (Sandbox Code Playgroud)

在开始时,集合是空的,并且关闭命令的按钮按预期变灰,但是通过附加的按钮添加文档AddDocument不会激活关闭文档按钮,什么是完成我需要的适当方法?PostSharp是仅将赋值而非方法调用视为更改还是完全不同于其他内容?

.net c# wpf postsharp

7
推荐指数
1
解决办法
181
查看次数

将图像写入 .net 中的每通道 32 位(每像素 128 位)位图

我在运行时生成 HDR 图像,需要以完美的质量保存(我通过多个滤镜链接这些图像,因此我希望每次都保持最大保真度,以避免过多的质量损失)。

我使用 PixelFormat.Format32bppArgb 用位图类保存那些,我也找到了 64 位格式,但列表中没有 128 位格式(每个通道 32 位 X 4 个通道)。

保存由 4 个浮点分量组成的颜色数组而不丢失的正确方法是什么?任何图像格式都可以,只要我可以从 .NET 做到这一点(如果内置不支持,第三方库也可以)。

我正在寻找一个最好的纯.net解决方案(没有非托管代码/非托管库的包装器来互操作)。

.net c# colors image-processing

5
推荐指数
1
解决办法
1602
查看次数