Avatar billede ng-km Nybegynder
06. juni 2011 - 21:59 Der er 7 kommentarer og
1 løsning

Datastruktur langsom på netværk

Jeg har lavet et lille program der håndterer nogle datafiler/objekter der primært indeholder 2 vectorer med hhv 1000 og 10000 objekter. Disse objekter består af hhv 3 og 4 Strings. Det hele er ganske simpelt opbygget og virker fortræffeligt når jeg afvikler programmet lokalt på en PC. Det åbner hurtigt og gemmer hurtigt.

Men når jeg placerer datafilen et eller andet sted på netværket  og åbner den derfra bliver det ekstremt langsomt at arbejde med. Det tager ca 20 sek at åbne og efterfølgende gemme data i filen. Filen fylder ca 450Kb.

Så fik jeg den ide at kopiere filen til den lokale PC og arbejde med den lokalt og kopiere tilbage når jeg skulle gemme, det nedsatte ventetiden til ca 2-3 sek. Dette er dog stadigvæk for meget, og derfor vil jeg lige høre om der er en bedre metode til håndtering af den mængde data på et netværk helst uden at skulle omskrive programmet til eksempelvis en Access-database.
Avatar billede arne_v Ekspert
06. juni 2011 - 22:04 #1
Bruger du buffered IO?
Avatar billede arne_v Ekspert
06. juni 2011 - 22:07 #2
BufferedInputStream og BufferedOutputStream med en buffer size > fil stoerrelsen var vaerd at proeve.
Avatar billede ng-km Nybegynder
08. juni 2011 - 20:52 #3
Undskyld den lange svartid.

Jeg bruger følgende til input:
File inFile = new File("Sti til fil");
FileInputStream stream = new FileInputStream(inFile);
ObjectInputStream inObjectStream = new ObjectInputStream(stream);
return (MyObject)inObjectStream.readObject();

Følgende til output:
File outFile = new File("Sti til fil");
FileOutputStream stream = new FileOutputStream(outFile);
ObjectOutputStream outObjectStream = new ObjectOutputStream(stream);
outObjectStream.writeObject(ovntype);
outObjectStream.close();

Hvad mener du det skal ændres til?
Avatar billede arne_v Ekspert
08. juni 2011 - 21:01 #4
ObjectInputStream inObjectStream = new ObjectInputStream(stream);
->
ObjectInputStream inObjectStream = new ObjectInputStream(new BufferedInputStream(stream));

ObjectOutputStream outObjectStream = new ObjectOutputStream(stream);
->
ObjectOutputStream outObjectStream = new ObjectOutputStream(new BufferedOutputStream(stream));
Avatar billede ng-km Nybegynder
18. juni 2011 - 12:40 #5
Til Arne

Jeg prøvede med en BufferedInput/OutputStream, men det gav ikke nogen synlig ændring i indlæsningstiden.

Hvis det skulle have din interesse, så fik dog efter mange forskellige krumspring løst opgaven på en lidt anden måde, der gav mig de svartider jeg forventer af et program, dvs. respons stort set øjeblikkeligt.

Jeg løste det ved at nedbryde mit dataobjekt til en lang (meget lang)tekststreng når jeg gemmer den. Jeg indlæser så fra disken/netværket via en BufferedReader der tager en FileReader som argument. Herefter nedbryder jeg tekststrengen med en StringTokenizer og opbygger mit dataobjekt lokalt via disse tokens. Jeg havde ikke regnet med at det ville være hurtigere, da jeg føler at jeg kodemæssigt behandler langt flere data, men virkeligheden er altså en helt anden. Jeg kan ikke give en anden forklaring end at den lange tekststreng bliver indlæst via netværket ekstremt hurtigt ift. at indlæse det samlede objekt.

Hvis du lægger et svar får du pointene.
Avatar billede arne_v Ekspert
18. juni 2011 - 23:35 #6
Proevede du med den rigtige buffer stoerrelse?
Avatar billede arne_v Ekspert
18. juni 2011 - 23:35 #7
og et svar
Avatar billede ng-km Nybegynder
19. juni 2011 - 21:00 #8
Ja, og Jeg synes ikke der var nogen synlig forskel på om jeg brugte bufferen med eller uden size.
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
Kurser inden for grundlæggende programmering

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