Я делаю некоторые необычные манипуляции с данными. У меня 36 000 входных файлов. Более того можно сразу загрузить в память. Я хочу взять первый байт каждого файла и поместить его в один выходной файл, а затем сделать это снова для второго и так далее. Это не нужно делать в каком-либо конкретном порядке. Поскольку входные файлы сжаты, загрузка их занимает больше времени, и они не могут быть прочитаны 1 байт за раз. В итоге я получаю байтовый массив каждого входного файла.Прочитайте десятки тысяч файлов и напишите миллионы файлов в Java
Входные файлы около ~ 1-6 МБ несжатого и ~ .3-1MB сжимаются (сжатие с потерями). Выходные файлы в конечном итоге являются количеством входных файлов в байтах. ~ 36 КБ в моем примере.
Я знаю, что ulimit может быть установлен на ОС Linux, и эквивалент может быть выполнен на окнах. Несмотря на то, что этот номер может быть поднят, я не думаю, что любая ОС будет напоминать миллионы файлов, которые будут написаны одновременно.
Мое текущее решение состоит в том, чтобы сделать потоки буферизованного потока в 3000 или около того, загружая каждый входной файл по очереди и записывая от 1 байт до 3000 файлов, а затем закрывая файл и загружая следующий вход. С этой системой каждый входной файл должен быть открыт примерно по 500 раз.
Вся операция занимает 8 дней, и это всего лишь тестовый пример для более практичного приложения, которое будет содержать более крупные входные файлы, больше их и больше выходных файлов.
Улавливание всех сжатых файлов в памяти, а затем их распаковка по мере необходимости не является практичным и не будет масштабироваться до больших входных файлов.
Я думаю, что решение будет состоять в том, чтобы буферизировать, что я могу, из входных файлов (поскольку ограничения памяти не позволяют буферизировать все это), а затем последовательно записывать файлы, а затем делать все заново.
Однако я не знаю, есть ли лучшее решение, используя что-то, о чем я не читаю.
EDIT Я благодарен за быстрый ответ. Я знаю, что я расплывчатый в применении того, что я делаю, и я попытаюсь исправить это. У меня в основном есть трехмерный массив [изображения] [X] [Y] Я хочу перебирать каждое изображение и сохранять каждый цвет с определенного пикселя на каждом изображении и делать это для всех изображений. Проблемы связаны с ограничениями памяти.
byte [] pixels = ((DataBufferByte) ImageIO.read (fileList.get (k)) .getRaster(). GetDataBuffer()). GetData();
Это то, что я использую для загрузки изображений, потому что он выполняет декомпрессию и пропускает заголовок.
Я не редактирую его как видео, потому что мне нужно будет получить фрейм, а затем превратить его в изображение (дорогостоящее преобразование цветового пространства), а затем преобразовать его в байт [], чтобы получить пиксельные данные int RGB.
Я могу загрузить каждое изображение и разделить его на ~ 500 частей (размер Y) и записать в отдельные файлы. Я оставляю открытым и записываю для каждого изображения. Выходы будут легко доступны на концерте. Полученный файл может быть полностью загружен в память и превращен в массив для последовательной записи файлов.
Промежуточные шаги означают, что я мог бы разделить нагрузку на сеть, но я пытаюсь сделать это на ноутбуке низкого качества с 4 ГБ оперативной памяти, без графического процессора и с низким качеством i7.
Я не думал о том, чтобы сохранить что-либо в файл как промежуточный шаг, прежде чем читать ответ от Дэвидбака. Размер - единственное, что делает эту проблему не тривиальной, и теперь я вижу, что размер можно разделить на более мелкие более управляемые куски.
не уверен, что часть 3 есть. Вам нужно распаковать файл и добавить первые несколько байтов в файл? почему до 3000 файлов? если у вас более 8 серверов, можно использовать hadoop – tgkprog
. Входы имеют одинаковый размер для заданного прогона, но могут быть очень большого размера между прогонами, а также очень много файлов. Если бы это было 1 МБ на, и 36000 файлов, то это был бы 36-гигабайтный файл, и это был недостаток. Тогда я мог бы прочитать этот файл очень предсказуемым образом. Каждый байт, который мне нужен, был бы 1 МБ (размер одного входного файла) отдельно, но, учитывая количество времени, чтобы собрать его в один массивный файл, действительно ли это намного быстрее? Он будет загружать, а затем выгружать каждый байт из 36 концертов в память только для завершения 1 файла. Это сделало бы это 1 миллион раз. –