Resolve memory issue when updating repo.
Solves issue # 453. Previously, it was reading one line at a time of the index file. Turns out that the entire index is only on about 5 lines, thus the 5th line is about 2mb. The solution here is to switch to reading a fixed length of 4096 characters at a time rather than entire lines. This ends up a bit more complex (because I wrote a custom tokenizer rather than being able to use Java String methods such as indexOf). There are still other memory issues on low memory devices, to do with trying to parse ~1000 app value objects into memory, each with numerous string objects associated with them. But that particular issue will be solved in the future, with the ContentProvider stuff.
This commit is contained in:
parent
772004756e
commit
4a7f0ef9a2
@ -22,13 +22,7 @@ import android.content.Context;
|
||||
|
||||
import com.nostra13.universalimageloader.utils.StorageUtils;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.Closeable;
|
||||
import java.io.File;
|
||||
import java.io.FileReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.*;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Locale;
|
||||
|
||||
@ -117,37 +111,30 @@ public final class Utils {
|
||||
|
||||
public static int countSubstringOccurrence(File file, String substring) throws IOException {
|
||||
int count = 0;
|
||||
BufferedReader reader = null;
|
||||
FileReader input = null;
|
||||
try {
|
||||
int currentSubstringIndex = 0;
|
||||
char[] buffer = new char[4096];
|
||||
|
||||
reader = new BufferedReader(new FileReader(file));
|
||||
while(true) {
|
||||
String line = reader.readLine();
|
||||
if (line == null) {
|
||||
break;
|
||||
input = new FileReader(file);
|
||||
int numRead = input.read(buffer);
|
||||
while(numRead != -1) {
|
||||
|
||||
for (char c : buffer) {
|
||||
if (c == substring.charAt(currentSubstringIndex)) {
|
||||
currentSubstringIndex ++;
|
||||
if (currentSubstringIndex == substring.length()) {
|
||||
count ++;
|
||||
currentSubstringIndex = 0;
|
||||
}
|
||||
} else {
|
||||
currentSubstringIndex = 0;
|
||||
}
|
||||
}
|
||||
count += countSubstringOccurrence(line, substring);
|
||||
numRead = input.read(buffer);
|
||||
}
|
||||
|
||||
} finally {
|
||||
closeQuietly(reader);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Thanks to http://stackoverflow.com/a/767910
|
||||
*/
|
||||
public static int countSubstringOccurrence(String toSearch, String substring) {
|
||||
int count = 0;
|
||||
int index = 0;
|
||||
while (true) {
|
||||
index = toSearch.indexOf(substring, index);
|
||||
if (index == -1){
|
||||
break;
|
||||
}
|
||||
count ++;
|
||||
index += substring.length();
|
||||
closeQuietly(input);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user