[英]java.lang.OutOfMemoryError: Java heap space with JSON conversion
[英]Reading JSON to object: java.lang.OutOfMemoryError: Java heap space
我有一個像這樣的JSON:
{
field1: "asd",
theBigField: "bigggg300mb",
field2: "tyu"
}
我在方法輸入參數上擁有的是InputStream。 我無法在JVM上增加內存,以便它可以接受該消息。 我也不能return new ObjectMapper().readValue(bytes, MyModel.class)
因為我沒有太多內存可以從此消息創建對象。 我想做的是從消息中提取field1和field2並根據某些規則對其進行驗證。
我在方法的開始處有InputStream。從中得到字節數組。如何提取field1
和field2
?
我正在使用Java8,可以使用流行的開源和輕量級庫。 也許可以通過編程以其他方式完成?
我要避免的是不要將整個消息讀入內存,因此應該采用某種迭代方法。
我的第一次嘗試是使用@JsonIgnore
注釋MyClass::theBigField
@JsonIgnore
(如果使用Jackson / ObjectMapper)。 不過,不確定是否可以使用。
作為最后的選擇,如果輸入結構是固定的並且您事先知道,則可以嘗試手動解析流。 像這樣:
private static void parseMyJson(InputStream stream) throws IOException {
StringBuffer[] fields = new StringBuffer[] { new StringBuffer(), null, new StringBuffer() };
int fieldNum = 0;
boolean readingFieldValue = false;
int read = 0;
while ((read = stream.read()) != -1) {
char readChar = (char) read;
if (readChar == '"') {
fieldNum += readingFieldValue ? 0 : 1;
readingFieldValue = !readingFieldValue;
} else if (readingFieldValue && fieldNum != 2) {
fields[fieldNum-1].append(readChar);
}
}
System.out.println(fields[0].toString());
System.out.println(fields[2].toString());
}
上面的代碼是一個非常原始且效率低下的解析器(您可能需要一些更高級的解析器),但要點是,您僅在內存中分配了一部分讀取字符,如果它們與您感興趣的字段不對應,則將其丟棄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.