7

我需要从数据库 (nvarchar) 中提取大型 Unicode 文本字符串(例如 200Mb)并存储在内存中进行处理。即我需要随机访问字符串的所有部分。

从严格以内存为中心的角度来看,使用 System.IO.MemoryStream 与 System.String 作为我的内存表示的优缺点是什么。

我正在尝试研究的一些因素是:

  • 这些对象如何在 [假设的] 高度碎片化的低内存环境中发挥作用
  • 不变性
  • 内存中的实际大小(如果流是 UTF8,我们是否将大小减半)
  • 还有一个我没有想过的对象吗?

我正在寻找关于这些点的清晰和建议,以及我没有想到的任何其他内存考虑?

注意:处理这些字符串可能有更好的方法,但此时我只是询问存储此类对象的内存考虑。

4

2 回答 2

6

从严格以内存为中心的角度来看,使用 System.IO.MemoryStream 与 System.String 作为我的内存表示的优缺点是什么。

我正在尝试研究的一些因素是:

  • 这些对象如何在 [假设的] 高度碎片化的低内存环境中发挥作用

IMO,MemoryStream 仅在编码很简单(例如 ASCII、ISO-8859-X 等)时才有用。如果编码是 UTF-8并且您有非 ASCII 字符,那么处理将变得更加困难。当然,MemoryStream 几乎肯定会消耗更少的内存,但除此之外没有太大区别。在底层,一个 MemoryStream 使用一个字节数组,它也需要在连续的内存块中分配。

  • 内存中的实际大小(如果流是 UTF8,我们是否将大小减半)

对,对于纯 ASCII 字符,MemoryStream 将消耗等效字符串消耗的一半。

  • 还有一个我没有想过的对象吗?
List<byte> // has a nicer interface for processing

字符串如何存储在数据库中?varchar 还是 nvarchar?

问候,

安德烈亚斯

于 2008-12-29T09:32:22.173 回答
4

字符串与流的内存相当无关紧要。字符串是 utf-16,因此可能涉及的倍数很小,但由于涉及的卷,您可能最好将数据写入暂存文件。

要从数据库中读取数据,请使用流技术;即使用 IDataReader (ExecuteReader),它处于顺序模式,并读取字节/字符块。不要试图阅读整列。

此外,对于 SQL Server 2008,您可能希望查看文件流类型。

例子:

于 2008-12-29T09:42:15.630 回答