Witam
Stworzenie (wygenerowanie) Listy obiektów z zastosowaniem programowania równoległego z wykorzystaniem dwu rdzeni procesora (bo taki posiadam) trwa około minuty. W generacji najwięcej czasu zajmuje procedura generacji wszystkich kombinacji pola ticket. Np. W dużym lotku wygenerowanie wszystkich kombinacji to prawie C(6,49) ~~ 14 milionów kombinacji.
Pomyślałem że jeżeli stworzę rodzinę plików dla wszystkich popularnych kombinacji to Listę można tworzyć jeszcze szybciej wg algorytmu :
Jeżeli plik C_6_49.cache istnieje to :
nie generuj tylko wczytaj listę z pliku.
Właściwie jeżeli się coś tu nadaje się do cachowania struktury w pliku to tylko zapis binarny bo deserializacje tekstowe (json,xml) daja pliki i czasy GigaWielkie. Uzycie BinaryFormater też trwa długo !.
strukrura zapisu :
[Serializable]
class filterInfo {
public bool filtered { set; get; }
public double value { set; get; }
public double diffvalue { set; get; }
public filterInfo(bool a=false, double b=0D, double c=0D) {
this.filtered = a;
this.value = b;
this.diffvalue=c;
}
}
[Serializable]
class ticketsData {
public int[] ticket { set; get; }
public filterInfo filterInfo { set; get; }
public string filterName { set; get; }
public ticketsData (int[] iticket,filterInfo ifilterInfo , string ifilterName = "ABC") {
this.ticket = iticket;
this.filterInfo = ifilterInfo;
this.filterName = ifilterName;
}
}
Ale nie jest tak słodko. Serializacja a bardziej deserializacja dla tak duzych plików trwa przerażajaco długo. Chyba że coś przeoczyłem lub nie wiem ?.
Pomyslałem ze użycie BinaryWriter w zapisie sekwencyjnym powinno zadziałać szybciej ale jak dotąd nie udało mi się nawet to sprawdzić ciągle generuję błędy, albo znów czegoś nie wiem ?.
public void save(string fname) {
FileStream fileStream = new FileStream(fname, FileMode.Create);
BinaryWriter binaryWriter = new BinaryWriter(fileStream);
foreach(ticketsData td in this.resultsList) {
ticketsData td = this.resultsList[0];
binaryWriter.Write((string)td.filterName);
binaryWriter.Write((int)td.ticket.Count());
foreach(int tic in td.ticket)
binaryWriter.Write((Int32)tic);
binaryWriter.Write((bool)td.filterInfo.filtered);
binaryWriter.Write((double)td.filterInfo.value);
binaryWriter.Write((double)td.filterInfo.diffvalue);
}
binaryWriter.Flush();
binaryWriter.Close();
}
Wydaje się że taki sekwencyjny zapis powinien być najszybszy i działać dobrze ale wciąż generuje błędy.
Może macie link do dobrej i szybkiej procedury zapisu, odczytu sekwencyjnego obiektów, lub jakiś pomysł ?. Bo na razie generacja na zywo wygrywa zdecydowanie.
pozdr
AK