OutOfMemory, когда файлы списка в каталоге

Когда я перечисляю файлы каталога, который имеет 300 000 файлов с Java, из памяти происходит.

String[] fileNames = file.list();

То, что я хочу, является путем, который может перечислить все файлы каталога инкрементно, неважно, сколько файлов в том определенном каталоге и не будет иметь "из памяти" проблемой со значением по умолчанию 64M предел "кучи".

Я имею Google некоторое время и не могу найти такой путь в чистом Java.
Пожалуйста, помогите мне!!

Примечание, JNI является возможным решением, но я ненавижу JNI.

11
задан mtk 23 July 2012 в 11:57
поделиться

3 ответа

Я знаю, что вы сказали: «С по умолчанию 64 м кучи кучи», но давайте посмотрим на факты - вы хотите удерживать (потенциально) большое количество предметов в памяти, используя механизмы, доступные для вас Java. Итак, если не существует какая-то тяжелая причина, которую вы не можете, я бы сказал, что увеличение кучи - это путь.

Вот ссылка на одно и то же обсуждение в Javaranch: http://www.coderanch.com/t/381939/java-general/java/iterate-over-files-directory

Редактировать В ответ на комментарий: Причина, по которой я сказал, что хочет провести большое количество предметов в памяти, заключается в том, что это единственный механизм Java предусматривает список каталога без использования собственного интерфейса или механизмов платформы (а ОП сказал Он хотел «чисто ява»).

5
ответ дан 3 December 2019 в 09:20
поделиться

Наличие 300 000 файлов в DIR - это не хорошая идея - файловые системы AFAIK не очень хороши на том, чтобы иметь множество подмазных узлов в одном узле. Интересный вопрос, хотя.

Редактировать: Ниже не помогает, см. Комментарии.

Я думаю, что вы можете использовать файлфильтр, отклонить все файлы и обрабатывать их в фильтре.

        new File("c:/").listFiles( new FileFilter() {
            @Override   public boolean accept(File pathname) {
                processFile();
                return false;
            }
        });
1
ответ дан 3 December 2019 в 09:20
поделиться

Когда вы используете литерал, как в этом случае, это просто синтаксический сахар, чтобы быстро создать объект NSString. После создания объект ведет себя так же, как и другой. Разница в том, что ваш ряд компилируется в программу, а не создается динамически.

-121--3560041-

Для установки дополнительных параметров можно использовать обратный вызов beforeSend (объект XMLHTTPRequest передается ему в качестве единственного параметра).

Чтобы вы знали, этот тип междоменных запросов не будет работать в обычном сценарии сайта и не будет работать с любым другим браузером. Я даже не знаю, какие ограничения безопасности накладывает FF 3.5, просто чтобы вы не били головой о стену просто так:

$.ajax({
    url: 'http://bar.other',
    data: { whatever:'cool' },
    type: 'GET',
    beforeSend: function(xhr){
       xhr.withCredentials = true;
    }
});

Еще одна вещь, к которой стоит остерегаться, это то, что jQuery настроен для нормализации различий в браузере. Дополнительные ограничения накладываются библиотекой jQuery, запрещающей этот тип функциональности.

-121--870605-

Вам немного не повезло здесь. Меньше всего нужно будет создать 300 тысяч последовательностей. Со средней длиной 8-10 символов и 2 байта на символ, которая 6Mb минимальной. Добавьте заголовок указателя объекта на последовательность (8 байт), и вы достигнете предела памяти.

Если у вас должно быть столько файлов в одном каталоге, что я бы не рекомендовал, так как у вашей файловой системы будут проблемы, лучше всего запустить собственный процесс (не JNI) через Runtime.exec. Имейте в виду, что вы свяжете себя с ОС (ls vs dir). Вы сможете получить список файлов в виде одной большой последовательности и будете нести ответственность за его последующую обработку в том, что вы хотите.

Надеюсь, это поможет.

2
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

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