标签: stringbuilder

如何最大化大对象堆中最大的连续内存块

情况是我正在对远程服务器进行WCF调用,该服务器将XML文档作为字符串返回.

大多数时候这个返回值是几K,有时几十K,非常偶尔几百K,但很少可能是几兆(第一个问题是我无法知道).

正是这些罕见的场合引起了悲伤.我得到一个开始的堆栈跟踪:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
   at System.Xml.BufferBuilder.AddBuffer()
   at System.Xml.BufferBuilder.AppendHelper(Char* pSource, Int32 count)
   at System.Xml.BufferBuilder.Append(Char[] value, Int32 start, Int32 count)
   at System.Xml.XmlTextReaderImpl.ParseText()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlTextReader.Read()
   at System.Xml.XmlReader.ReadElementString()
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderMDRQuery.Read2_getMarketDataResponse()
   at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer2.Deserialize(XmlSerializationReader reader)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
Run Code Online (Sandbox Code Playgroud)

我已经阅读了,因为大对象堆刚刚变得过于分散,所以即使在调用之前快速检查StringBuilder.EnsureCapacity只会导致OutOfMemoryException被提前抛出(因为我猜测需要什么) ,它可能实际上并不需要那么多,所以我的检查引起的问题比它解决的问题多得多.有些意见认为我无能为力.

我问过自己的一些问题:

  • 使用更少的内存 - 你检查了泄漏?是.内存使用率上下波动,但没有基本增长可以保证这种情况发生.有些时候它失败了,它在之前的那个阶段取得了成功.
  • 转移较小的金额不是一个选项,这是我无法控制的第三方网络服务(或者至少需要很长时间才能解决,同时我还有问题)
  • 你能为卫生部做些什么来减少失败吗?......现在这是最富有成效的课程.这是一个32位的过程(它必须出于各种政治,技术和无聊的原因),但通常有数百兆的免费(我们看到失败的最大数量的倍数).
  • 我们可以监控LOH吗?使用perfmon我可以跟踪堆的大小,但我认为没有办法监视最大可用的连续内存块. …

c# wcf stringbuilder out-of-memory

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

哪个字符串比StringBuilder更有用?

已经有很多关于字符串和字符串构建器之间差异的问题,大多数人都认为字符串构建器比字符串更快.我很想知道字符串构建器是否太好所以为什么字符串存在?此外,有些正文可以给我一个例子,其中字符串比字符串构建器更有用吗?

c# string stringbuilder heuristics

5
推荐指数
3
解决办法
1057
查看次数

在这个上下文String.Format或String.Replace会更快?

string str = 'my {0} long string {1} need formatting';
Run Code Online (Sandbox Code Playgroud)

我应该做以下事情,

str = string.Format(str, "really", "doesn't");
Run Code Online (Sandbox Code Playgroud)

或者创建一个类似的方法并调用 str = str.ReplaceWithValues("really", "doesn't");

 public string ReplaceWithValues(this string str, params object[] values) {
    string ret = str;
    for (int i = 0; i < values.Length; i++) {
        ret = str.Replace(string.Concat("{", i, "}"), values.ToString());
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

看起来StringBuilder.AppendFormat()在执行像这样的简单替换时效率不高,因为它通过字符串逐个字符地进行.

c# string stringbuilder string-formatting

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

StringBuilder的容量如何变化?

当我有StringBuilder一个容量为5 的空,我写"你好,世界!" 对它来说,C#标准是否指定了新的容量StringBuilder?我有一个模糊的记忆,它是新字符串长度的两倍(以避免每个新附加的字符串改变容量).

.net c# stringbuilder capacity

5
推荐指数
2
解决办法
1968
查看次数

stringbuilder调用中的Java字符串concat

据我所知,StringBuilder通过在concats期间不在字符串池中创建临时字符串实例来帮助减少内存使用量.但是,如果我这样做会发生什么:

StringBuilder sb = new StringBuilder("bu");
sb.append("b"+"u");
Run Code Online (Sandbox Code Playgroud)

它编译成了吗?

sb.append("b");
sb.append("u");
Run Code Online (Sandbox Code Playgroud)

?或者它取决于优化标志?或者,如果使用stringbuilders,我会失去整个好处?或者这个排队没有意义?:)

java string stringbuilder

5
推荐指数
2
解决办法
2131
查看次数

NULL对象的StringBuffer行为

当NULL对象附加到实例时,我无法理解StringBuilder的以下行为:

public class StringBufferTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String nullOb = null;
        StringBuilder lsb = new StringBuilder();

        lsb.append("Hello World");
        System.out.println("Length is: " + lsb.length());// Prints 11. Correct

        lsb.setLength(0);
        System.out.println("Before assigning null" + lsb.length());    
        lsb.append(nullOb);
        System.out.println("Length now is:" + lsb.length()); // Prints 4. ???
    }

}
Run Code Online (Sandbox Code Playgroud)

最后一个打印语句不打印0.任何人都可以帮我理解行为吗?

java null stringbuilder

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

将图像添加到Android中的Messaging应用程序

我正在尝试创建一个自定义键盘并在android SDK中使用"SoftKeyboard"示例.我对该示例进行了少量修改并创建了我的自定义键盘.我可以将此自定义键盘与我的Android设备的默认消息应用程序一起使用.

现在,我想单击自定义键盘中的按钮,并在键入SMS时添加图像.我注意到String Builder在"SoftKeyBoard.java" class(private StringBuilder mComposing = new StringBuilder())中,当我们使用键盘输入字母时它会附加字符.

我试图在下面添加我的SD卡图像,

        String imageDataString = "";

        String path = Environment.getExternalStorageDirectory().toString() + "/SamplePictures/";
         File file = new File(path, "myimage.jpg");
         try {

             FileInputStream imageInFile = new FileInputStream(file);
             byte imageData[] = new byte[(int) file.length()];
             imageInFile.read(imageData);

             // Converting Image byte array into Base64 String
             imageDataString = encodeImage(imageData);



            imageInFile.close();

         } catch (FileNotFoundException e) {
             System.out.println("Image not found" + e);
         } catch (IOException ioe) {
             System.out.println("Exception while reading the Image …
Run Code Online (Sandbox Code Playgroud)

keyboard stringbuilder android

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

使用StringBuilder的回文检查器

我试图创建一个回文检查器.我正在使用StringBuilder,我发现附加空格有点棘手.

编辑:除了使用.reverse()之外还有其他方法吗?谢谢你的回答.:d

当单词没有空格时,此代码有效:

public String palindrome (String anyString) {

StringBuilder sb = new StringBuilder();

for (int i = anyString.length()-1; i>=0; i--) {
        sb.append(anyString.charAt(i));
}

String string2 = sb.toString();

return string2;
}
Run Code Online (Sandbox Code Playgroud)

当输入的单词有空格时; 它返回一个字符串,其中包含第一个空格的字符.

例如:

word = "not a palindrome"
palindrome(word) = "emordnilap"
Run Code Online (Sandbox Code Playgroud)

期待 ="emordnilap一吨"


我试过插入

if (anyString.charAt(i) != ' ')
    sb.append(anyString.charAt(i));
else 
    sb.append(' ');
Run Code Online (Sandbox Code Playgroud)

在代码的中间,但它不起作用.

多谢你们!

java stringbuilder palindrome

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

StringBuilder将null附加为"null"

怎么会?

    StringBuilder sb = new StringBuilder();

    sb.append("Hello");
    sb.append((String)null);
    sb.append(" World!");
    Log.d("Test", sb.toString());
Run Code Online (Sandbox Code Playgroud)

产生

06-25 18:24:24.354:D/Test(20740):Hellonull World!

我希望附加一个null字符串根本不会附加!!
顺便说一句,演员String是必要的,因为StringBuilder.append()有很多重载版本.

我在这里简化了我的代码,在我的代码中得到了一个返回字符串的方法

public String getString() { ... }
...
sb.append(getString());
...
Run Code Online (Sandbox Code Playgroud)

getString()有时回归null; 现在我必须测试它,如果我想使用StringBuilder!!!!

此外,让我们在这里澄清一下我的问题:如何StringBuilder.append()以优雅的方式接受空字符串,而不是将其转换为文字字符串"null".
优雅,我的意思是我不想得到字符串,测试它是否null只是然后追加它.我正在寻找一个优雅的oneliner.

java stringbuilder android

5
推荐指数
2
解决办法
8004
查看次数

StringBuilder是否在每个操作中创建一个新的String?

使用此代码创建了多少个对象? - 我知道3个字符串文字在字符串常量池中,而StringBuilder对象在堆中但是当我调用reverse(),insert()或append()时它是否在池中创建了一个新字符串?

StringBuilder sb = new StringBuilder("abc");
sb.append("def").reverse().insert(3, "---");
System.out.println( sb );
Run Code Online (Sandbox Code Playgroud)

java string stringbuilder

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