2013-11-12 2 views
0

Привет, У меня возникла проблема с реализацией алгоритма чередования. У меня также есть проблема загрузки 30000 записей в одном векторе, я пробовал это, но он не работает.реализовать алгоритм чередования C++

Программа должна объявлять переменные для хранения ОДНОГО ЗАПИСИ за раз. Он должен прочитать запись и обработать ее, затем прочитать другую запись, и так далее. Каждый процесс должен игнорировать записи, которые «принадлежат» другому процессу. Это можно сделать, отслеживая количество записей и определяя, должна ли текущая запись обрабатываться или игнорироваться. Например, если есть 4 процесса (numProcs = 4), процесс 0 должен работать с записями 0, 4, 8, 12, ... (если считать, что мы подсчитываем от 0) и игнорировать все остальные записи между ними. «

Residence res; 
int numProcs = 4; 
int linesNum = 0; 
int recCount = 0; 
int count = 0; 

while(count <= numProcs) 
{ 
    while(!residenceFile.eof()) 
    { 
     ++recCount; 
     //distancess.push_back(populate_distancesVector(res,foodbankData)); 
     if(recCount % processIS == linesNum) 
     { 
      residenceFile >> res.x >>res.y; 
      distancess.push_back(populate_distancesVector(res,foodbankData)); 
     } 
     ++linesNum; 

    } 
    ++count; 
} 

Обновить код

Residence res; 
int numProcs = 1; 
int recCount = 0; 



    while(!residenceFile.eof()) 
    { 
     residenceFile >> res.x >>res.y; 

     //distancess.push_back(populate_distancesVector(res,foodbankData)); 
     if (recCount == processId)//process id 
     { 
      distancess.push_back(populate_distancesVector(res,foodbankData)); 
     } 
     ++recCount; 
     if(recCount == processId) 
      recCount = 0; 
    } 

код обновления Sudo

while(!residenceFile.eof()) 
    { 
     residenceFile >> res.x >>res.y; 


     if (recCount % numProcs == numLines) 
     { 
      distancess.push_back(populate_distancesVector(res,foodbankData)); 
     } 
     else 
      ++numLines 
     ++recCount 
    } 
+0

Обновленный код кажется запутанным (и запутанным); это 'numProcs' * количество процессов * или * идентификатор процесса *? – Beta

+0

это processID –

+0

jsut Я хочу видеть, что обновленная логика правильная? –

ответ

0

Вы отметили сообщение с помощью MPI, но я не вижу места, где вы проверяете идентификатор процессора, чтобы увидеть, какую запись он должен обрабатывать.

псевдокод для решения то, что я думаю вы спрашиваете:

While(there are more records){ 
If record count % numProcs == myID 
    ProcessRecord 
else 
    Increment file stream pointer forward one record without processing 
Increment Record Count 
} 

Если вы знаете # записей вы будете обработки заранее, то вы можете придумать умное решение для перемещения указатель потока подачи вперед на numprocs записей до тех пор, пока это не будет достигнуто или не превзойдено.

+0

@ninjaDeveloper: вы будете обрабатывать только записи numProcs' в обновленном коде. Обратите внимание на оператор модуля '%' в моем псевдокоде. Ознакомиться с модульной математикой, это будет полезно для вас как разработчика. – AndyG

+0

спасибо за псевдокод «указатель потока файла shoud вперед одна запись без обработки» будет чем-то вроде номера строки –

+0

@ninjaDeveloper: Ну, вам понадобится способ пропустить данные для записи, которую вы не хотите обрабатывать. Если вы знаете, что это всего лишь 2 ints, вы можете просто прочитать в 2 ints и выбросить их. Если вы знаете, что это будет какая-то строка, вызовите 'getline', а затем ничего не сделайте со строкой, в которую вы читали. По внешнему виду вы уже читаете 'res.x' и' res.y', так что, вероятно, вы хотите. – AndyG

0

процесс, который будет действовать на записи 0 и 4, должны по-прежнему г ead записи 1, 2 и 3 (для того, чтобы добраться до 4).

Кроме того, while(!residenceFile.eof()) не является хорошим способом перебора файлов; он будет читать один раунд за концом. Сделайте что-то вроде while(residenceFile >> res.x >>res.y).

Что касается создания вектора, содержащего 30 000 записей, это звучит как ограничение памяти. Вы уверены, что вам нужно столько в памяти сразу?

EDIT:

Посмотрите внимательно на обновленный код. Если идентификатор процесса (numProcs) равен нулю, процесс будет действовать на первую запись, а другой нет; если это что-то еще, он будет действовать на none из них.

EDIT:

Увы, я не знаю арабский. Я попытаюсь объяснить на английском.

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

Во-первых, написать цикл, который перебирает {0,1,2,3, ...} и выводит все числа:

int i=0; 
while(i<10) 
{ 
    cout << i << endl; 
    ++i; 
} 

Поймите это, прежде чем идти дальше. Затем написать цикл, который перебирает таким же образом, но печатает только {0,4,8, ...}:

int i=0; 
while(i<10) 
{ 
    if(i%4==0) 
    cout << i << endl; 
    ++i; 
} 

Поймите это, прежде чем идти дальше. Затем напишите цикл, который выводит только {1,5,9, ...}. Затем напишите цикл, который читает файл, и сообщает о каждой записи. Затем объедините это с логикой из предыдущего упражнения и сообщите только по одной записи каждые четыре.

Начните с чего-то маленького и простого. Добавьте сложность в небольшие меры. Разрабатывайте новые методы в изоляции. Проверяйте каждый шаг. Никогда не добавляйте к коду, который не работает. Это способ писать код, который работает.

+0

@ninjaDeveloper: Хорошо, я постараюсь дать вам код. Только один вопрос: вы уверены, что знаете, как дать каждому процессу идентификатор процесса из {0,1,2,3}? – Beta

Смежные вопросы