[C#] FileStream zonder system cache

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Topicstarter
Ik schrijf een programma waarin zeer grote bestanden gestreamed moeten worden. Uiteraard wil je daarbij niet dat de system cache volloopt waardoor zo'n beetje alle andere dingen op je systeem baggertraag worden. In een unmanaged taal zou ik die files openen met de flag FILE_FLAG_NO_BUFFERING, maar ik kan in .NET (2.0) daar geen equivalent voor vinden.

Ik heb wel een artikel gevonden waarin staat hoe je die flag kan gebruiken (weet alleen niet of dat werkt), maar dat is unsafe code en ik weet niet zeker of dat ook goed werkt op het x64 en IA64 framework. Dat is nml wel belangrijk, dat dat werkt...

Wat ik nu heb, is een FileStream object dat wordt aangemaakt met FileOptions.WriteThrough voor het schrijven van grote bestanden, en FileOptions.SequentialScan voor het lezen ervan. Maar geen van deze omzeilt de system cache. De eerste omzeilt alleen maar de fysieke schrijfcache van de harddisk zelf. De tweede "optimaliseert" de file handle voor sequentieel lezen; leuk, maar het lost mijn probleem niet op.

Iemand een nette oplossing? Liefst een die niet "unsafe" is en op x86, x64 en IA64 werkt? :)

日本!🎌


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Iets met FileStream.SafeFileHandle proberen?
Is volgens mij nog net managed maar ik weet het ook niet zeker.
Er is ook een constructor voor FileStream waarbij je de buffersize op kan geven. Ik weet niet zeker wat dit met de system cache doet maar dat zou ook een optie kunnen zijn.

hier wordt ook wat over cache en FileStream gezegd maar daar rennen ze al snel naar P/Invoke en dat is niet echt wat je wil.

[ Voor 18% gewijzigd door MTWZZ op 17-02-2006 17:36 ]

Nu met Land Rover Series 3 en Defender 90


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Topicstarter
SafeFileHandle lijkt inderdaad een heel aardige optie, maar daarvoor moet je dus een handle uit het OS oplepelen. En daarvoor moet je dus een DllImport doen. Even afgezien van of dat op Mono zou werken, zal dat wel op de verschillende hardware platforms werken?

Je hebt dus niet alleen 32/64 bits, maar tussen NT en 9x heb je ook nog es respectievelijk unicode en ansi...

日本!🎌


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Hm daar heb je een punt.
Zou je niet beter voordat je je app echt start een soort van benchmark te doen om te kijken welke buffer size voor die FileStream het gunstigste is?
Wilde gok maar mayb helpt het.

Nu met Land Rover Series 3 en Defender 90


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Topicstarter
Dat zou ik kunnen doen, maar daarmee omzeil ik de filecache nog niet ;)

日本!🎌


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

True, maar zou die system cache niet gewoon per stream oid werken?

Nu met Land Rover Series 3 en Defender 90


  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Even een flinke schop maar op zich relevant:
hier staat een stukje over FileStreams en interne buffers in .Net 2.0

Nu met Land Rover Series 3 en Defender 90


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 06-03 20:19

_Thanatos_

Ja, en kaal

Topicstarter
Nog maar even een schopje dan :)

Ik heb inmiddels een class gemaakt, waarin weliswaar DllImport gebruikt wordt, maar het lijkt in ieder geval in zowel x86 als x64 te werken. IA64 weet ik niet, want ik heb hier geen Itanium-bak...

Maargoed, ik wil jullie dit stuk code toch niet onthouden:
http://thany.org/downloads/NonBufferedFileStream.rar

Ohja, de performance t.o.v. een normale FileStream is in mijn geval verdubbeld, dus het is de moeite wel waard :)

日本!🎌

Pagina: 1