什么时候在Memory <t>上使用ArraySegment <t>?

时间:2018-09-07 14:30:42

标签: c#

我正在研究将“视图”返回到非常大的数组的最佳方法,发现import pandas as pd df = pd.DataFrame([ "7", "D-25", "K110", "NO7", "NO-8" ], columns=["original",]) df["suffix"] = df["original"].str.extract("(\D+)").str.replace("-","") df["character"] = df["original"].str.extract("(\d+)") 非常适合我的需求。但是,然后我发现 original suffix character 0 7 NaN 7 1 D-25 D- 25 2 K110 K 110 3 NO7 NO 7 4 NO-8 NO- 8 的行为似乎相同,只是需要跨度才能查看内存。

对于将视图创建和写入大型(2GB +)数组的用例,使用哪一个无关紧要?

使用大数组的原因是它们保存图像的字节。

1 个答案:

答案 0 :(得分:1)

内存有点像Span的包装器-不必在堆栈中。而且正如CoolBots提供的链接所指出的那样,它是对数组和数组段的补充,并不是对它们的真正替代。

您要考虑使用Span / Memory的主要原因是性能和灵活性。 Span使您可以直接访问内存,而不必将其来回复制到阵列中,并且它使您可以灵活地处理内存。下面,我将从使用数组作为字节到将其用作uint数组。

我将直接跳到Span,但是您可以改用AsMemory,以便更轻松地传递它。但这仍然归结为从内存中获取Span。

这是一个例子:

        const int dataSize = 512;
        const int segSize = 256;

        byte[] rawdata = new byte[dataSize];

        var segment = new ArraySegment<byte>(rawdata, segSize, segSize);

        var seg1 = segment.AsSpan();

        var seg1Uint = MemoryMarshal.Cast<byte, uint>(seg1);

        for (int i = 0; i < segSize / sizeof(uint); ++i)
        {
            ref var data = ref seg1Uint[i];

            data = 0x000066;
        }

        foreach (var b in rawdata)
            Console.WriteLine(b);