我正在研究将“视图”返回到非常大的数组的最佳方法,发现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 +)数组的用例,使用哪一个无关紧要?
使用大数组的原因是它们保存图像的字节。
答案 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);