Hallo
Ik heb een implementatie gemaakt van een binary search tree, dit persistent (op schijf dus).
Wikipedia: Binary search tree
Kort gezegd is elke node een aantal bytes, waarbij er sommigen bytes verwijzen naar een andere locatie binnenin het bestand (parent, left child, right child).
Nu, geen echte verrassing, bij het wegschrijven van veel nodes (met unieke key dan), begint dit lang te duren. (1 miljoen nodes wegschrijven duurde 3 minuten).
Misschien tegenstrijdig voor mensen die deze datastructuur niet kennen: bij profilen in Visual Studio is het de native Stream.Read methode die ongeveer 75% van de totale tijd in beslag neemt. Dit omdat de tree constant gelezen moet worden om af te dalen en te bepalen waar een volgende node moet komen.
Ik heb geprobeerd om het bestand (enkele tientallen megabytes, zeer variabel natuurlijk) gewoon in een MemoryStream te steken, daar alle bewerkingen te doen, en dan weg te schrijven, maar een MemoryStream is jammergenoeg niet uitbreidbaar, dus m.a.w. ik kan geen nieuwe data toevoegen.
Zijn er nog zaken die ik (relatief makkelijk) kan proberen vooraleer ik kijk naar MemoryMapped files of iets dergelijks? Ook deze laatste lijkt me niet direct een oplossing lijkt me, omdat dit op het eerste zicht enkel in memory views maakt van een file (?)
Enige tips over "random read/ocassional write" gekoppeld aan performantie zijn welkom.
Ik heb een implementatie gemaakt van een binary search tree, dit persistent (op schijf dus).
Wikipedia: Binary search tree
Kort gezegd is elke node een aantal bytes, waarbij er sommigen bytes verwijzen naar een andere locatie binnenin het bestand (parent, left child, right child).
Nu, geen echte verrassing, bij het wegschrijven van veel nodes (met unieke key dan), begint dit lang te duren. (1 miljoen nodes wegschrijven duurde 3 minuten).
Misschien tegenstrijdig voor mensen die deze datastructuur niet kennen: bij profilen in Visual Studio is het de native Stream.Read methode die ongeveer 75% van de totale tijd in beslag neemt. Dit omdat de tree constant gelezen moet worden om af te dalen en te bepalen waar een volgende node moet komen.
Ik heb geprobeerd om het bestand (enkele tientallen megabytes, zeer variabel natuurlijk) gewoon in een MemoryStream te steken, daar alle bewerkingen te doen, en dan weg te schrijven, maar een MemoryStream is jammergenoeg niet uitbreidbaar, dus m.a.w. ik kan geen nieuwe data toevoegen.
Zijn er nog zaken die ik (relatief makkelijk) kan proberen vooraleer ik kijk naar MemoryMapped files of iets dergelijks? Ook deze laatste lijkt me niet direct een oplossing lijkt me, omdat dit op het eerste zicht enkel in memory views maakt van een file (?)
Enige tips over "random read/ocassional write" gekoppeld aan performantie zijn welkom.