【问题标题】:Large Strings taking forever to 'create'大弦乐永远“创造”
【发布时间】:2013-07-17 15:47:15
【问题描述】:

我有一个程序将文件的字节加载到十六进制数组中,数组的结果长度为 16,777,216。我对数组进行了一些快速编辑,将其转换为一个巨大的字符串(长度为 33,554,432),以便可以将其转换回字节数组并写入一个新文件。好吧,我尝试这样做。

问题是字符串的创建需要很长时间,即使在等待几分钟(这是我所期望的全部时间)之后也是如此。我认为没有更好的方法来设置这个字符串,就像我目前拥有的那样,但是有没有办法通过保持十六进制数组原样来完成这个?或者是否有一种简单的方法让我只修改我需要的偏移量而不重写整个文件?

 Dim tHex As String = ""
 For i = 0 To gloBytes.Length - 1
     tHex &= gloBytes(i)
 Next

感谢您的帮助。

【问题讨论】:

  • 您正在遍历文件中的每个字节,然后逐个字符地构建转换后的字符串……难怪它很慢……1600 万次转换 + 1600 万次字符串连接…… .
  • @MarcB - 这些连接中的每一个都必须创建一个新字符串并从旧字符串中复制数据。

标签: vb.net binary hex


【解决方案1】:

如果您要对字符串进行大量操作,您应该使用StringBuilder 而不是直接附加到String

由于System.String 是不可变的,因此每次执行tHex &= gloBytes(i) 时,都会创建一个全新的字符串。这会导致大量的内存流失,并对 GC 施加很大的压力,进而导致整个事情变得非常缓慢。

另一方面,StringBuilder 旨在允许您多次附加到“字符串”而不是搅动内存,因为它是一个可变类,专门设计用于允许执行多个操作,然后转换为最后一个字符串(通过ToString())。

使用StringBuilder 的等效代码是:

Dim tmp as New StringBuilder(gloBytes.Length * 2)
For i = 0 To gloBytes.Length - 1
    tmp.Append(gloBytes(i))
Next
Dim tHex As String = tmp.ToString()

【讨论】:

  • 谢谢你让我觉得有点傻!但说真的,谢谢。不知道为什么我以前没有想到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多