Seite 3 von 4

Re: Simple Container [Include]

Verfasst: 14.09.2010 15:02
von cxAlex
Interessant :D

Ich habe deine Proceduren ein bisschen angepasst sodas man beliebig viel Versionen der Liste in einem SC - Container speichern kann und die ganze Liste in einem Eintrag, das ersparte einem eine menge Overhead:

Code: Alles auswählen

Macro _AddStringToMem(_Mem, _String, _SizeCounter)
  _Mem = ReAllocateMemory(_Mem, _SizeCounter + StringByteLength(_String) + SizeOf(Character) + SizeOf(Long))
  PokeL(_Mem + _SizeCounter, StringByteLength(_String) + SizeOf(Character))
  PokeS(_Mem + _SizeCounter + SizeOf(Long), _String)
  _SizeCounter + StringByteLength(_String) + SizeOf(Character) + SizeOf(Long)
EndMacro

Macro _AddLongToMem(_Mem, _Long, _SizeCounter)
  _Mem = ReAllocateMemory(_Mem, _SizeCounter + SizeOf(Long))
  PokeL(_Mem + _SizeCounter, _Long)
  _SizeCounter + SizeOf(Long)
EndMacro

Macro _GetStringFromMem(_Mem, _String, _SizeCounter)
  _String = PeekS(_Mem + _SizeCounter + SizeOf(Long), PeekL(_Mem + _SizeCounter))
  _SizeCounter + SizeOf(Long) + PeekL(_Mem + _SizeCounter)
EndMacro

Macro _GetLongFromMem(_Mem, _Long, _SizeCounter)
  _Long = PeekL(_Mem + _SizeCounter)
  _SizeCounter + SizeOf(Long)
EndMacro

Procedure SC_SavePersonen(SC, Id$, List Person.sPerson())
  Protected *SaveMem, MemSize,  ListCount, MainCount = ListSize(Person())
  
  *SaveMem = AllocateMemory(SizeOf(Long))
  PokeL(*SaveMem, MainCount)
  MemSize = SizeOf(Long)
  
  ForEach Person()
    
    ListCount = ListSize(Person()\Telefon())
    _AddStringToMem(*SaveMem, Person()\Vorname, MemSize)
    _AddStringToMem(*SaveMem, Person()\Nachname, MemSize)
    _AddLongToMem(*SaveMem, ListCount, MemSize)
    
    ForEach Person()\Telefon()
      _AddStringToMem(*SaveMem, Person()\Telefon()\Nummer, MemSize)  
      _AddStringToMem(*SaveMem, Person()\Telefon()\Typ, MemSize)  
    Next
    
  Next
  
  SC_AddEntry(SC, Id$, *SaveMem, MemSize)
  
EndProcedure

Procedure SC_LoadPersonen(SC, Id$, List Person.sPerson())
  Protected i, ii, *SaveMem, MemSize, ListCount, MainCount
  
  If SC_GetEntry(SC, Id$)
    
    *SaveMem = SC_GetMem(SC)
    MainCount = PeekL(*SaveMem)
    MemSize = SizeOf(Long)
    
    
    For i = 1 To MainCount
      AddElement(Person())
      _GetStringFromMem(*SaveMem, Person()\Vorname, MemSize)
      _GetStringFromMem(*SaveMem, Person()\Nachname, MemSize)
      _GetLongFromMem(*SaveMem, ListCount, MemSize)
      
      For ii = 1 To ListCount
        AddElement(Person()\Telefon())
        _GetStringFromMem(*SaveMem, Person()\Telefon()\Nummer, MemSize)
        _GetStringFromMem(*SaveMem, Person()\Telefon()\Typ, MemSize)
        
      Next  
      
    Next
    
  EndIf
  
EndProcedure
Hoffentlich kannst du das brauchen :D

Gruß, Alex

Re: Simple Container [Include]

Verfasst: 14.09.2010 15:12
von Kiffi
cxAlex hat geschrieben:Hoffentlich kannst du das brauchen :D
Aber Hallo! :D

Vielen Dank für Deine Optimierungen & Grüße ... Kiffi

Re: Simple Container [Include]

Verfasst: 21.09.2010 12:47
von cxAlex
Update:
  • Logger eingebaut, nützlich für Debugzwecke
  • Transaction/Commit eingebaut, bei richtiger Verwendung viel Performancegewinn
  • LinkedLists auf PB - Listen umgestellt, per Macros gewrappt, leichter Performancegewinn
  • Header- & Indexkompression
  • BugFix: Header & Index werden nur mehr neu geschrieben wenn sich die Datei auch wirklich ändert

Download:
http://cxalex.bplaced.net/public/Simple-Conainer.zip

Gruß, Alex

Re: Simple Container [Include]

Verfasst: 21.09.2010 12:55
von Kiffi
Bild

Grüße ... Kiffi

Re: Simple Container [Include]

Verfasst: 21.09.2010 14:16
von cxAlex
Bitte :D

Eine genaue Beschreibung folgt noch, habe nur grade wenig Zeit, spätestens Morgen Vormittag gibts exakte Erklärungen zu den neuen Features.

Gruß, Alex

Re: Simple Container [Include]

Verfasst: 22.09.2010 14:41
von cxAlex
So wie versprochen:

Nachtrag/Erklärung zu den neuen Features:


Ein neues Feature in dieser Version ist der Logger, der sämtliche Aktionen von SC mit-zeichnet und später wiedergibt, bzw. sämtliche hinzugefügten/entfernten Dateien, fehlschlagen von Packvorgängen ... der Sinn ist wohl selbstverständlich, Debugzwecke usw ... .

Header&Index - Kompression wird nun unterstützt. Da sich die Headerinfos zu jedem Eintrag doch sehr ähneln lässt sich doch etwas Speicherplatz sparen. Das ganze passiert intern, kein weiteres Zutun ist nötig.

Eine sehr, sehr wichtige Neuerung ist das Transaction/Commit - System. Die Verwendung ist einfach: SC_Transaction() startet eine Transaction, SC_Commit() beendet sie.

Was passiert bei einer Transaction?
Man kann sämtliche SC - Befehle in einem Transaction/Commit - Block ganz normal weiterverwenden. Der Unterschied ist das SC sämtliche Änderungen aber nur im Cache durchführt, das ganze aber nicht! auf die Datei überträgt.

Was sind die Vorteile?
Sehr einfach und schnell erklärt: die Performance.
Wenn man viele, viele kleine Änderungen an der Datei vornimmt, viele Entrys hinzufügt/löscht usw. spart man sich dadurch viele Zugriffe auf die Datei und, wenn die Datei verschlüsselt ist, viele, viele Verschlüsselungsvorgänge die ja auch ihre Zeit brauchen. So wird alles auf einen rutsch Verschlüsselt und geschrieben, was die Performance der Anwendung gewaltig erhöhen kann.

Was sind die Nachteile?
Man muss sich im klaren sein das der Cache und der Inhalt der Datei auseinander laufen, inkonsistent werden. Stürzt die Anwendung ab bevor ein Commit ausgeführt wurde werden die Änderungen nicht in den Container übernommen. Das Transaction/Commit System funktioniert nur wenn der Speichercache aktiv ist!

Wann wird trotz Transaction in die Datei geschrieben?
Wenn der Speichercache voll ist, die vorgegebene Begrenzung erreicht ist, bzw. die Datei geschlossen wird.

Das Transaction/Commit System wird Intern noch weiterentwickelt. Ich würde mich freuen wenn ein paar Leute die SC vielleicht schon in ihren Projekten nutzen das ganze mal auf Herz und Nieren prüfen würden. Es gibt einfach zu viele Kombinationen aus Kompression/Verschlüsselung/usw... um das alleine testen zu können, über hier gefundene Bugs würde ich mich besonders freuen :D


Gruß, Alex

Re: Simple Container [Include]

Verfasst: 27.09.2010 18:32
von cxAlex
Update:
  • Transaction/Commit optimiert, eigene Commit Liste, es muss nun nicht mehr der ganze Cache durchforstet werden.
  • BugFix: Cacheprobleme in der x86 Version behoben
  • BugFix: SC_Configure() konnte unter bestimmten Umständen zum Absturz führen
  • BugFix: x86/x64 Version sind nun wieder vollständig kompatibel
  • BugFix: SC_SetName() konnte mehrere Entrys mit demselben Namen erzeugen
Ein kleines Bugfix/Verbesserungs Release. Nun beginnt die Arbeit an einem Rollback für das Transaction/Commit System und Gruppierung von Einträgen, ähnlich Ordnern.

Download:
http://cxalex.bplaced.net/public/Simple-Conainer.zip

Gruß, Alex

Re: Simple Container [Include]

Verfasst: 28.09.2010 08:31
von Rings
cxAlex hat geschrieben:...
Download:
http://cxalex.bplaced.net/public/Simple-Conainer.zip
..
Nen Fehler im Namen (Conainer) , aber der Download geht trotzdem .

Danke für deine tolle Arbeit bisher.

Re: Simple Container [Include]

Verfasst: 28.09.2010 09:25
von cxAlex
Na sowas, dummer Fehler :oops:
Wird mit dem nächsen Release behoben.

Danke :D

Gruß, Alex

Re: Simple Container [Include]

Verfasst: 28.09.2010 19:30
von cxAlex
Neuer Download Link: http://files.cxalex.bplaced.net/secure. ... tainer.zip oder im 1. Post.

Neue Features sind in Arbeit. Gerade ist ein Asyncron-Modus implementiert worden (per JobQueue) der bereits ohne besondere Anpassungen merkbaren Performancegewinn bringen kann. Neues Release demnächst.

Zum Rollback: Ist das wirklich jemanden von nutzen, sonst würde ich das eher nicht implementieren, es würde (wenn man es nicht braucht) nur unnötig viel Speicher fressen und währe noch dazu intern sehr komplex, was sicher viele Bugs/lange Debugphasen bis zu einer stabilen Version verursachen würde.

Gruß, Alex