от
Вам предоставляется список имен файлов и их длины в байтах. Пример: Файл1: 200 Файл2: 500 Файл3: 800 Вам дано число N. Мы хотим запустить N потоков, чтобы читать все файлы параллельно, чтобы каждый поток примерно считывал равное количество байтов. Вы должны вернуть N списков. Каждый список описывает работу одного потока: Пример, когда N = 2, есть два потока. В приведенном выше примере всего 1500 байт (200 500 800). Фарватер для деления - для каждого потока читать 750 байт. Итак, вы вернетесь: Два списка Список 1: Файл1: 0 - 199 Файл2: 0 - 499 Файл3: 0-49 ---------------- Всего 750 байт Список 2: Файл 3: 50-799 -------------------- Всего 750 байт Реализуйте следующий метод
List> getSplits(List files, int N) 
Class File { 
String filename; long length } 
Class FileRange { 
String filename Long startOffset Long endOffset } 
I tried with this one but it's not working any help would be highly appreciated.
List> getSplits(List files, int n) {
        List> al=new ArrayList<>();
        long s=files.size();
        long sum=0;
        for(int i=0;i0){
                lo[i] =1;
                mod

У меня проблема с startOffset и endOffset с соответствующим файлом. Я попробовал это, но я не смог извлечь из List и добавить в виде требуемого типа возврата List>.
    

        

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

1 Ответ

0 голосов
от
Суть проблемы заключается в том, чтобы одновременно пройтись по двум спискам: список ввода, который представляет собой список файлов выходной список, представляющий собой список потоков (где каждый поток имеет список диапазонов) Я считаю, что самый простой подход к таким проблемам - это бесконечный цикл, который выглядит примерно так:
while (1)
{
    move some information from the input to the output
    decide whether to advance to the next input item
    decide whether to advance to the next output item
    if we've reached (the end of the input _OR_ the end of the output)
        break
    if we advanced to the next input item
        prepare the next input item for processing
    if we advanced to the next output item
        prepare the next output item for processing
}
Чтобы отслеживать ввод, нам нужна следующая информация
fileIndex
индекс в список файлов
fileOffset
смещение первого неназначенного байта в файле, изначально 0
fileRemain
количество байтов в файле, которые не были назначены, изначально размер файла Чтобы отслеживать результат, нам нужно
threadIndex
индекс потока, над которым мы сейчас работаем (который является первым индексом в
List
...