Чтение файла несколькими потоками - PullRequest
1 голос
/ 02 марта 2011

У меня есть файл 250 Мб для чтения.И приложение является многопоточным.Если я разрешаю всем потокам читать файл, происходит голодание памяти.Я получаю из памяти ошибку.

Чтобы избежать этого.Я хочу, чтобы в памяти была только одна копия строки (которая читается из потока), и я хочу, чтобы все потоки ее использовали.

while (true) {
    synchronized (buffer) {
        num = is.read(buffer);
            String str = new String(buffer, 0, num);

    }
    sendToPC(str);
}

По сути, я хочу иметь только одну копию строки, когда всепоток завершил отправку, я хочу прочитать вторую строку и т. д.

Ответы [ 4 ]

6 голосов
/ 02 марта 2011

Почему несколько потоков? У вас есть только один диск, и он может двигаться только так быстро. Многопоточность это не поможет, почти наверняка. И любой дизайн программного обеспечения, основанный на наличии целого файла в памяти, изначально имеет серьезные недостатки.

Предположим, вы определили свою проблему ?

2 голосов
/ 08 октября 2011

Я понимаю, что это немного поздно, но я думаю, что вам нужно здесь использовать функцию map в классе FileChannel. Как только вы отобразите область файла в память, тогда все ваши потоки смогут читать или записывать в этот блок памяти, и ОС будет периодически синхронизировать эту область памяти с файлом (или когда вы вызываете MappedByteBuffer.load ()), и если вы хотите, чтобы каждый поток работал с отдельной частью файла, вы можете назначить несколько карт, каждая из которых отображает определенную область файла, и просто использовать одну карту для потока.

см. Javadoc для FileChannel , RandomAccessFile и MappedByteBuffer

1 голос
/ 03 марта 2011

Вы можете зарегистрировать все потоки в качестве обратных вызовов в классе чтения файлов.У SO есть что-то вроде массива или списка классов, реализующих интерфейс StringReaderThread, который имеет метод processString (String input).После прочтения каждой строки из файла выполните итерацию по этому массиву / списку и вызовите processString () для всех потоков таким образом.Решит ли это вашу проблему?

1 голос
/ 02 марта 2011

Не могли бы вы напрямую использовать потоки вместо полного чтения файла в память?

...