2 ГБ байтов увеличится вдвое, так как String
обычно будет содержать char[]
, а char
- это двухбайтовое значение UTF-16.
Лучше всего будет иметь некоторое сжатие, возможно, на 20Кб куски файла, как уже упоминалось.Приложению также может быть выделено больше памяти -DXmax=2g
.
Ваш код предполагает, что огромный файл представляет собой простой текст (или HTML, или дамп SQL, или файл журнала).
Я сделалсжатие на основе строк (что не так хорошо, даже отрицательно для пустых строк).
Path path = Paths.get(bigFile); // String bigFile
Path path = bigFile.toPath(); // File bigFile
Charset charset = Charset.defaultCharset(); // Or whatever the charset is.
List<byte[]> compressedLines = Files.lines(path, charset)
.map(line -> compress(line)) // Or compress(line + "\n")
.collect(Collectors.toList());
byte[] compress(String s) {
byte[] content = s.getBytes(StandardCharsets.UTF_8);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (GZipOutputStream out = new GZipOutputStream(baos)) {
out.write(content);
}
return baos.toByteArray();
}
String decompress(byte[] compressed) {
ByteArrayInputStream bais = new ByteArrayInputStream(compressed);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try (GZipInputStream in = new GZipInputStream(bais)) {
byte[] buf = new byte[128];
for (;;) {
int nread = in.read(buf, 0, buf.length);
if (nread <= 0) {
break;
}
baos.write(buf, 0, nread);
}
}
return new String(baos.toByteArray(), StandardCharsets.UTF_8);
}
Возможно, это не лучшее решение, как есть.