OutOfMemoryError читает текстовый файл размером 174 Мб с большими строками

Используйте эту функцию:

static func returnFloatValue(data: NSMutableData) -> Float {
    let bytes = [UInt8](data as Data)
    var f: Float = 0

    memcpy(&f, bytes, 4)
    return f
}

И вы можете увидеть ее в действии здесь:

var initialValue: Float = 19.200

let data = NSMutableData(bytes: &initialValue, length: 4)

func returnFloatValue(data: NSMutableData) -> Float {
    let bytes = [UInt8](data as Data)
    var f: Float = 0

    memcpy(&f, bytes, 4)
    return f
}

var result:Float = returnFloatValue(data: data)

print("f=\(result)")// f=19.2
5
задан George Z. 27 March 2019 в 13:05
поделиться

2 ответа

Оберните ваш InputStream фильтрующим:

class QuotedNewLineFilterInputStream extends FilterInputStream {

    private boolean insideQuotes;

    public QuotedNewLineFilterInputStream(InputStream in) {
        super(in);
    }

    @Override
    public int read() throws IOException {
        int c = super.read();
        if (c == '\"') {
            insideQuotes = !insideQuotes;
        }
        if (insideQuotes && (c == '\n' || c == '\r')) {
            c = read();
        }
        return c;
    }
}

Это удалит LF и CR внутри двойных кавычек. Поскольку все они являются ASCII, а XML вероятен в UTF-8, можно работать на байтовом уровне (InputStream).

Кстати, замена на \t может лучше сохранить макет (c = \ t 'i.o. c = read()).

Не очень умный, но простое решение.

0
ответ дан Joop Eggen 27 March 2019 в 13:05
поделиться

Если чтение файла размером 174 МБ с Files.readAllBytes(Paths.get(path)); вызывает OutOfMemoryError, то вам не удалось увеличить предел памяти с -Xmx8g. При использовании кучи памяти объемом 8 ГБ не должно быть проблем с выделением 174 МБ непрерывной памяти для byte[]

Дважды проверьте, как вы прошли флаг -Xmx. Вы можете проверить параметры времени выполнения JVM, подключившись к работающему JVM-серверу с помощью JConsole, JVisualVM или другого инструмента. Взгляните на Использование JConsole , в котором показано, как проверить параметры времени выполнения JVM, например, Вкладка «Память».

0
ответ дан Karol Dowbecki 27 March 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: