ASP code verdacht traag

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Ik heb een ASP pagina waarnaartoe ik een file kan uploaden middels HTTP POST. De data van die file wil ik vervolgens met een INSERT of UPDATE statement naar een database plempen.

Oplossing: zet de data om naar een hexadecimale string. Waarom? Nou, Update() en AddNew() werken niet goed. Er wordt gewoon aangeraden alles in een INSERT/UPDATE statement te zetten.

:? Wat is het probleem nou?
Het omzetten naar een hexadecimale string verloopt waanzinnig traag. Een bestandje van 100KB duurt meer dan een minuut!

:? Wat is je code?
Die heb ik ook voor je:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
Function DBBinaryToString(Binary)
   Dim HexValues : HexValues = Array("00", "01", ... "FE", "FF")
   Dim I, S
   If IsNull(Binary) Or (LenB(Binary) = 0) Then
    DBBinaryToString = Null
   Else                                 
    S = "0x"
    For I = 1 To LenB(Binary)
       S = S & HexValues(AscB(MidB(Binary, I, 1)))
    Next
    DBBinaryToString = S
   End If
End Function

Waarom is dit dus zo traag? En wat kan ik doen om het te versnellen? Het mag een serverside component zijn, maar liever gewoon VBScript code.

日本!🎌


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
Ten eerste: 100Kb = 1024*100 bytes. Dus deze lus herhaalt zich grofweg 100.000 keer. Dat is reden 1 waarom het zo lang duurt. Of snap ik het nu gewoon niet?

Ten tweede: databases zijn voor relationele data, filesystems voor bestanden. Waarom sla je in hemelsnaam een bestand in een DB op? En, als je dat doet, waarom dan niet een BLOB veld?

Verwijderd

Ik zou niet anders verwachten dat dit baggertraag is...deze loop wordt idd 100.000 uitgevoerd...ik zie persoonlijk ook niet echt het nut ervan in. Ben zowiezo niet zo'n fan van het opslaan van plaatjes, laat staan andere files in een database...het is namelijk ook niet echt bevordelijk voor de performance van de database...

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 14-08 12:38

Crazy D

I think we should take a look.

Wat ik me meer afvraag, waarom doe je het zo omslachtig? Imho is het makkelijker om met het stream object de file in te lezen (en via een command object aan een stored proc door te geven), of met de uh even uit m'n hoofd, ik dacht dat ie AppendChunck heette, method van het recordset object. Nou doe ik niet zo regelmatig wat met files opslaan in de db, maar ik meen mij te herinneren van wat ik gelezen had, dat dat "de" manier was.

Exact expert nodig?


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Je kan mij een hoop vertellen, maar met een 750MHz cpu, hoeft het echt niet een hele minuut te duren om ~100.000 bytejes te doorlopen. Ik zie bestanden kopiëren van 10MB in 1 seconde, 25 videoframes renderen in 1 seconde, een JPEG van 2048x1536 encoden in fractie van een seconde. Ik ga echt niet geloven dat zo'n miezerig bestandje een hele minut moet duren. Daar moet iets voor zijn.

Ten tweede kan ik de bestanden helemaal niet op disk opslaan, omdat je natuurlijk niet altijd toegang tot het filesystem van de server hebt met ASP code (als het goed is zelfs helemaal niet).

Ten derde kan ik AppendChunk enzo niet gebruiken omdat de ODBC driver daarmee nogal buggy werkt (MyODBC). Ik heb het heus wel geprobeerd. Je krijgt echt de meest waanzinnige fouten.

edit: en zneek, natuurlijk is het een blob-veld, waarom denk jij in godsnaam van niet??

日本!🎌


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Op woensdag 24 juli 2002 01:51 schreef _Thanatos_ het volgende:
Je kan mij een hoop vertellen, maar met een 750MHz cpu, hoeft het echt niet een hele minuut te duren om ~100.000 bytejes te doorlopen. Ik zie bestanden kopiëren van 10MB in 1 seconde, 25 videoframes renderen in 1 seconde, een JPEG van 2048x1536 encoden in fractie van een seconde. Ik ga echt niet geloven dat zo'n miezerig bestandje een hele minut moet duren. Daar moet iets voor zijn.
code:
1
2
3
    For I = 1 To LenB(Binary)
       S = S & HexValues(AscB(MidB(Binary, I, 1)))
    Next

Dit geintje gaat dus 100.000 keer; daar is ie wel ff mee bezig. Verder: Je doet S = S & constructie. Deze is niet efficient; de hele tijd de S ophalen en weer bijschrijven. Om deze reden is deze constructie in ASP.Net zelfs vervangen. Verder gebruik je een scriptingtaal en geen compiled language; dit kost ook tijd.
Die andere bestanden die je noemt, zijn geoptimaliseerd voor die taak en al die bestanden zijn compiled.
Daarnaast is kopieren iets anders dan zo een berekening uitvoeren.
Ten tweede kan ik de bestanden helemaal niet op disk opslaan, omdat je natuurlijk niet altijd toegang tot het filesystem van de server hebt met ASP code (als het goed is zelfs helemaal niet).
Wat is hier goed aan? Als je in een db wilt schrijven, heb je ook write-access nodig, lijkt me? (Of je moet MySQL of SQL Server o.i.d. gebruiken). Echter, als je toegang hebt tot de geavanceerdere db-systemen, moet write-access ook te regelen zijn. Op het gebied van veiligheid is niets mis met write-access; dit is goed in te stellen en er zijn genoeg voorbeelden te vinden dat het wel goed is.
edit: en zneek, natuurlijk is het een blob-veld, waarom denk jij in godsnaam van niet??
Hou het er maar op dat we hier de meest vreemde dingen hebben gezien.. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Ik gebruik inderdaad MySQL (in m'n vorige reply had ik het ook over MyODBC...), dus write-acces bestaat niet per definitie al. Dat is niet altijd zo.

Daarnaast is write access best te regelen, dat is het punt niet. Het gaat erom dat dat gewoon niet netjes is (vind ik dan).

Is er misschien niet een weg om via ASP bij de mysql library functies te komen? dan kan ik mysql_escape_string() gewoon gebruiken. Daarvan weet ik zeker dat het razendsnel gaat.

En, ik wil nog wel ff 1 ding rechtzetten:
Verder gebruik je een scriptingtaal en geen compiled language; dit kost ook tijd
Dit gaat niet helemaal op. Ik heb een keer een test gedaan, waarin ik een bestand van 5MB uploadde. Dit duurde ongeveer 45 seconden op een PII-350, of ik nou een x86 gecompileerd ASP component gebruikte, of een pure VBScript class. We kunnen dus voorzichtig zeggen dat VBScript wel degelijk gecompileert wordt.

日本!🎌


Verwijderd

<quote>Dit gaat niet helemaal op. Ik heb een keer een test gedaan, waarin ik een bestand van 5MB uploadde. Dit duurde ongeveer 45 seconden op een PII-350, of ik nou een x86 gecompileerd ASP component gebruikte, of een pure VBScript class. We kunnen dus voorzichtig zeggen dat VBScript wel degelijk gecompileert wordt.</quote>

duh.... een file uploaden kost inderdaad niet erg veel resources....... probeer maar eens 5mb aan data te doorloopen dan het aantal keren dat alle karakters voorkomt te tellen, werkt denk ik iets beter om snelheid te testen

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-08 21:00

Creepy

Tactical Espionage Splatterer

Op woensdag 24 juli 2002 03:32 schreef _Thanatos_ het volgende:
Ik gebruik inderdaad MySQL (in m'n vorige reply had ik het ook over MyODBC...), dus write-acces bestaat niet per definitie al. Dat is niet altijd zo.

Daarnaast is write access best te regelen, dat is het punt niet. Het gaat erom dat dat gewoon niet netjes is (vind ik dan).

Is er misschien niet een weg om via ASP bij de mysql library functies te komen? dan kan ik mysql_escape_string() gewoon gebruiken. Daarvan weet ik zeker dat het razendsnel gaat.

En, ik wil nog wel ff 1 ding rechtzetten:
[..]

Dit gaat niet helemaal op. Ik heb een keer een test gedaan, waarin ik een bestand van 5MB uploadde. Dit duurde ongeveer 45 seconden op een PII-350, of ik nou een x86 gecompileerd ASP component gebruikte, of een pure VBScript class. We kunnen dus voorzichtig zeggen dat VBScript wel degelijk gecompileert wordt.
Uploaden is ff iets anders dan byte voor byte een bestand doorlopen en omzetten. Als je een bestand upload, geef je de webserver en de client een schop voor dat uploaden. Als dat uploaden eenmaal loopt, dan is er geen ASP code wat hier nog tussen zit hoor. Pas als het bestand weer is geupload zal de server je ASP script weer aan de gang laten gaan.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

in VBScript (ASP) de binary data opvangen in een upload routine kost echt veel tijd, want je moet ook elke byte langsfietsen.

De topicstarter doet er goed aan, zoals crazy al zegt, naar het Stream object te kijken in de ADO library.

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Zoals ik al zei, het Stream object werkt wel, maar ik kan geen AppendChunk en Update methoden gebruiken, omdat ze niet goed werken met de MyODBC driver.

Ik heb al iets beters: ik heb een functie geschreven die ongeveer hetzelfde doet als mysql_escape_string() in de MySQL library. Zien? :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
Function MysqlEscapeString(Str)
  Dim From
  From = RSBinaryToString(Str)
  From = Replace(From, &quot;\&quot;, &quot;\\&quot;)
  From = Replace(From, Chr(0), &quot;\0&quot;)
  From = Replace(From, Chr(13), &quot;\r&quot;)
  From = Replace(From, Chr(10), &quot;\n&quot;)
  From = Replace(From, &quot;'&quot;, &quot;\'&quot;)
  From = Replace(From, &quot;&quot;&quot;&quot;, &quot;\&quot;&quot;&quot;)
  From = Replace(From, Chr(26), &quot;\Z&quot;)
  MysqlEscapeString = From
End Function

dit werkt echt retesnel ;)

日本!🎌


  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18-08 22:57

Gerco

Professional Newbie

Op woensdag 24 juli 2002 19:07 schreef _Thanatos_ het volgende:
dit werkt echt retesnel ;)
Dat zal wel ja, maar wat doe je met CHR(1) t/m CHR(31) en met CHR(128) t/m CHR(255)?

Die zijn niet bepaald allemaal gewoon 'printable', pakt MySQL die gewoon in een string?

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!

Pagina: 1