Round Robin Gleichmäßige Verteilung

Hallo,
gleich zu meinem Problem:

Ich habe 2 CSV Dateien mit Listen für VMs und Hardware Maschinen. Jede HW und VM hat CPU, Memory und Netzwerk. Nun habe ich 100 HW-Maschinen (natürlich alles simuliert zu lernzwecken) und 10.000 VMs. Ich möchte jetzt die VMs gleichmäßig auf die HWs verteielen.

Meine Gedanken:
Ich nehme eine ArrayList, aber die ist nicht 2 Dimensional. Ich könnte auch ein festes 2Dim-Array nehmen. Aber das ist nicht Flexibel.

Jetzt frage ich mich zwei Sachen:
1. Wie laufe ich Geschickt über meine VMs und weiße Sie zu der HW zu. Auch dazu habe ich mir Gedanken gemacht.

Ich könnte einfach die komplette VMs in einer schleife durchlaufen. In Durchgang 1 bekommt HW1 = VM1, im zweiten Durchgang bekommt HW2 = VW2 zugewiesen. Jetzt kommt eine Sache für die ich noch keine Lösung habe. Was ist bei VM101. Diese Soll dann wieder HW 1 zugewiesen werden. Wie mach ich das denn Geschickt?

2. Frage was für ein Array eignet sich? Oder gibt es da andere geschicktere Lösungen?

Es handelt sich um eine Übungsaufgabe, ich möchte hierzu auch keine Komplettlösung, sondern würde mich sehr über eine Hilfestellung freuen.

Vielen Dank.

Mein Aktueller Code
Java:
package mcc_a3;


import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import com.csvreader.CsvReader;

public class Lastverteilung {

    public static void main(String[] args) {
        try {
            CsvReader historyCSV =  new CsvReader("VMHistory10000.csv");
            CsvReader hardwareCSV10_000 = new CsvReader("HWRessources10000_random.csv");
            CsvReader hardwareCSV100 = new CsvReader("HWRessources100_random.csv");
            List<String> hardwareNameList = new ArrayList<String>();
            hardwareCSV100.readHeaders();
            while(hardwareCSV100.readRecord()){
                hardwareNameList.add(hardwareCSV100.get("HWs"));
            //    System.out.println(hardwareCSV100.get("HWs"));
            }
            /*
            historyCSV.readHeaders();
            System.out.println("VMs \t  CPU  \t Netz  \t Normierte Last");
            while(historyCSV.readRecord()){
              
                String vm = historyCSV.get("VMs");
                float cpu = Float.parseFloat(historyCSV.get("CPU"));
              
                float mem = Float.parseFloat(historyCSV.get("Mem"));
                float netz = Float.parseFloat(historyCSV.get("Netz"));
                float nmLast = (cpu/4+mem/4999+netz/499)/3;
                //System.out.println(vm + "\t " + cpu + "\t " + mem + "\t " + netz + "\t " + nmLast);
              
            }
            */
          
            for (int i = 0; i < hardwareNameList.size(); i++) {
                System.out.println(hardwareNameList.get(i));
            }
          
          
        } catch (FileNotFoundException e) {
            System.out.println("File not Found" + e.getMessage());
          
        } catch (IOException e) {
            System.out.println("IO" + e.getMessage());
        }

    }

}
 
Zuletzt bearbeitet von einem Moderator:

InfectedBytes

Top Contributor
Modulo Operator (Restwert Division)
Du hast HWs 0 bis 99 und VMs 0 bis 999
Wenn du nun alle VMs durchläufst, könntest du per vmID % 100 auf die HW schließen.
VM 0 bis 99 werden daher den HWs 0 bis 99 zugewiesen.
VM 100 wird dann wieder HW 0 zugewiesen, da 100 % 100 == 0 ist, usw.

Anstatt das ganze per Round Robin zu machen, könntest du auch einfach die Anzahl der VMs durch die Anzahl der HWs teilen und dann die ersten 10 zu HW0 zuweisen, die nächsten zehn zu HW1, usw.
 
Vielen Dank. An den Index sollte ich irgendwie kommen. Es steht in der Tabelle leider immer HW1 HW2 usw. Das muss leider schon wegen der Aufgabenstellung Round Robin sein.

Jetzt soll das ergebnis ungefähr so aussehen:
https://drive.google.com/file/d/0Bw-3UOKNVkwLRXpLSTRpTVJ0UWc/view?usp=sharing

Nun Frage ich mich, was für ein Datentyp eignet sich für die speicherung der ganzen Daten. Klar wäre eine Datenbank super. Aber das ist für mich wohl nicht so möglich. Also läuft es wohl auf ein 2 Dimensionales Array raus. Nur schade das es einfach nicht flexibel ist. Sowas wie eine Array List wäre cool.
 

InfectedBytes

Top Contributor
Dann nutz doch auch eine ArrayList.
Um das ganze ordentlich zu managen, solltest du dir am besten sowieso eine extra Klasse für HW und VM erstellen
Java:
public class VM {
//z.b. name, OS, etc. speichern
}

public class HW {
  private String name;
  private ArrayList<VM> vms = new ArrayList<>();
  // sonstige daten
}

public class Manager {
  private ArrayList<HW> hws = new ArrayList<>();
}

Diese Beispielhafte Manager klasse kann nun beliebig viele HWs aufnehmen und jede einzelne HW kann wiederum beliebig viele VMs aufnehmen.
 

Ähnliche Java Themen

Neue Themen


Oben