1

I have a chat like desktop java swing app, where i keep getting String type data. Eventually the String variable keeps growing larger and larger.

1) Is it wise idea to keep the large variable in memory and only when the logging is finished save this to disk.

2) If not, then should i continue saving everytime i get a new string (of length about 30-40).

How should i go about optimizing such a desgin?

3
  • 3) only keep the last n lines in history, and discard the rest. Are you sure you need everything in the first place? Commented Jan 13, 2012 at 16:14
  • I don't think you would need to save until after that conversation ended. You could implement a timer though i guess, if the user doesn't close the window after so long it gets saved and removed from RAM. you could also limit the size of a response to < 5000 characters or something so that the program can't be stopped by someone with bad intentions. Commented Jan 13, 2012 at 16:18
  • How big is 'big'? Do you care how long it take to save the log to disk? Commented Jan 13, 2012 at 16:26

2 Answers 2

4

I would use a BufferedWriter, like PrintWriter. This will buffer the data for you and write every 8 KB (actually every 8192 characters). If you want to write more often you can use flush() or a smaller buffer.

PrintWriter pw = new PrintWriter("my.log");

// will actually write to the OS, 5 times. (1000 * 40 / 8192)
for(int i = 0; i < 1000; i++) {
   pw.printf("%39d%n", i); // a 40 character number.
}

pw.flush();

or you can use

pw.println(lineOfText);

BTW: If you want to know what a really huge file looks like ;) This example writes an 8 TB file http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html

Sign up to request clarification or add additional context in comments.

2 Comments

I would actually use this. My answer is for speed/memory efficiency only, but this is better.
@Sara Lol, that's the nicest comment all day. ;)
1

Perhaps you should use a StringBuilder. Append each new message to it, and at the end convert it to a string.

For example,

StringBuilder sb = new StringBuilder();  
// Do your code that continuously adds new messages/strings.
sb.append(new_string);  
// Then once you are done...
String result = sb.toString(); 

If you were to have some string, say String message, and every time you got a new message/string you did message += new_string, it will eat up more memory.

As suggested by Viruzzo, only save so much, then discard the earlier strings at some point. Don't hold on to every message forever.

2 Comments

yes yes, i don't want to discard the data. So saving to file is not wise idea? should be done only at the end no matter if app is running and continuously getting data for more then 3-4 hrs>??
I agree. StringBuilder is fast these days.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.