Avatar billede mmbn Nybegynder
11. august 2006 - 18:41 Der er 12 kommentarer og
3 løsninger

Fil skrivning

Jeg skal oprette en ny fil per række i en database der gdt kan indeholde op til flere millioner rækker.

Jeg afprøvet både FileStream og Streamwriter
med både
using(FileStream fs = new..)
{
  fs.Write()
} og 

fs = new FileStream
try
{
  fs.Write()
}catch()finally

men efter de tabeller hvor filerne oprettes fra er gennemløbet virker det som om programmet sløver ned

Når der bruges using - frigives alle ressourcer så ikke efter brug automatisk?

Hvilken måde vil være den mest optimale til at oprette så mange filer?

ps. alle filer ligger i hver deres directory som bliver oprettet med Directory.CreateDirectory()
Avatar billede arne_v Ekspert
11. august 2006 - 19:00 #1
using boer frigive alle ressourcer

men det vil tage lang tid at oprette flere millioner filer
Avatar billede mmbn Nybegynder
11. august 2006 - 19:04 #2
det er ok at det tager tid - men det er efter filerne er oprettet og man ikke bruger de specifikke writere mere at det virker som om det sløver ned. det skal siges at resten af basen tabller bliver skrevet til hver deres fil. hvis jeg udkommenterer de steder hvor filerne oprettes fortsætter resten af applikation i væsentligt højere tempo
Avatar billede arne_v Ekspert
12. august 2006 - 01:13 #3
at oprette så mange filer kan godt stresse styre systemet lidt måske
sker der nogle ting i IO eller memory subsystemerne som skal tilbage
til normal inden de performer godt

rent gætværk
Avatar billede mmbn Nybegynder
12. august 2006 - 08:53 #4
Er der nogle effektive metoder til at kontrollere dette eller hjælpe det på vej?

Skal man ud i noget GC.Collect()? Eller skal der eventuelt sættes noget Thread.Sleep() ind efter hver (eller hver 100) oprettelse af fil?
Avatar billede mmbn Nybegynder
12. august 2006 - 09:53 #5
Ville det kunne betale sig at evt at brugen BufferedStream
som eks

using(FileStream fs = new FileStream(path, FileMode.Create()))
{
  using(BufferedStream bs = new BufferedStream(fs, sizeOfFile)) //sizeoffile = kolonnestrengen.Length
  {
      using(BinaryWriter bw = new BinaryWriter(bs))
      {
        bw.write();
      }
  }
}

Ville det kunne betale sig? hvor den buffered size kun vil være allokeret til samme størrelse som filen bliver?
Avatar billede -xyz- Nybegynder
12. august 2006 - 20:36 #6
Nu er det bre et gæt, men måske du skulle prøve at køre programmet på en 2003 server el. lign, med mindre du allerde har gjort det da det jo er lavet til den slags.
Avatar billede mmbn Nybegynder
12. august 2006 - 20:54 #7
Programmet er afprøvet på 2k3 server - med samme virkninger. Endvidere er det afprøvet på windows xp pro samt på en bærbar med XP pro - på alle OS har det samme virkning.

Jeg har endnu ikke nået at afprøve det med en bufferedstream men det er da en mulighed jeg ikke har afprøvet før
Avatar billede mmbn Nybegynder
12. august 2006 - 20:55 #8
Endvidere er det afprøvet på en 2000 server
Avatar billede mmbn Nybegynder
12. august 2006 - 21:03 #9
For at forklare det mere overordnet:

Programmet løber samtlige tabeller i en Oracle database igennem - de fleste af tabellerne skrives række efter række til én fil (altså hele tabellen) - i nogle udvalgte tabeller skal nogle specifikke kolonner (long felter) skrives til hver deres fil i hver deres mappe. Det kan godt dreje sig om forholdsvis store baser eksempelvis tabeller der indholder 2-3 mio rækker
Avatar billede mmbn Nybegynder
12. august 2006 - 21:04 #10
I disse tilfældem hvis der er long felter, skal der oprettes 2.3 mio mapper og filer - det er efter programmet har været igennem disse tabeller at det sløves - hvis tabeller der indeholde long felter udkommenteres vil resten af programmet køre i væsentligt højere tempo
Avatar billede mmbn Nybegynder
12. august 2006 - 21:06 #11
basen er placeret på en ekstern database server - dvs at der hentes over netværk
Avatar billede mmbn Nybegynder
26. september 2006 - 09:28 #12
lukker...
Avatar billede mmbn Nybegynder
26. september 2006 - 09:29 #13
xyz og arne  smid et svar så deler jeg pointene mellem os alle
Avatar billede arne_v Ekspert
26. september 2006 - 13:15 #14
ok
Avatar billede -xyz- Nybegynder
26. september 2006 - 22:20 #15
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester