Объединение частей нескольких файлов в один файл в Java - PullRequest
0 голосов
/ 01 августа 2020

У меня есть n файлов, каждый из которых содержит m блоков данных.

    File 0 Contents:
    file0.block1
    file0.block2
    file0.block3
    file0.block4
    ..
    file0.blockM
    File 1 Contents:
    file1.block1
    file1.block2
    file1.block3
    file1.block4
    ..
    file1.blockM

...

    File n Contents:
    fileN.block1
    fileN.block2
    fileN.block3
    fileN.block4
    ..
    fileN.blockM

Блоки имеют переменный размер. Блоки с одинаковым идентификатором могут иметь переменные размеры в разных файлах.

Объединенный файл должен выглядеть следующим образом.

    Merged File Contents:
    file0.block1
    file1.block1
    ...
    fileN.block1
    
    file0.block2
    file1.block2
    ...
    fileN.block2
    
    ..
    
    file0.blockM
    file1.blockM
    ...
    fileN.blockM

1 Ответ

0 голосов
/ 01 августа 2020

Неужели N настолько велико, что не закрывать файлы? По крайней мере, на Linux жесткий предел возможных открытых файлов довольно велик. ulimit -Hn дает мне 1048576 на Xubuntu 20.04. Мягкий предел намного меньше, по умолчанию 1024, но его можно увеличить с помощью ulimit -n N. Не уверен, какие разумные значения для N есть, но вы можете попробовать использовать то, что, по вашему мнению, является максимальным N, с которым вы столкнетесь в своем приложении. Примечание: я не знаю, накладывает ли Java ограничения, выходящие за рамки того, что делает ОС, или если для сохранения миллиона открытых файлов требуется много памяти (я ожидаю, что стоимость памяти для InputStream будет порядка нескольких КБ). Кроме того, я не знаю, как это работает на Windows.

Единственная золотая середина, которую я могу придумать между постоянным открытием / закрытием файлов или постоянным сохранением всех файлов открытыми, - это обработка ряда файлы за раз и объединить их во временные файлы, а затем объединить временные файлы, чтобы сформировать окончательный результат. Ясно, что это позволяет избежать сценария открытия / закрытия, но происходит за счет более частой перезаписи данных, что может замедлить работу вращающихся дисков и изнашивать твердотельные накопители, если файлы значительного размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...