Bonsoir,
J'ai créé une application qui télécharge sur plusieurs threads/sockets et qui écrit a la fois dans un fichier.
Pour l'instant voici ce que je fais :
Tout ce qui suit est dans un backgroundworker et les index etc.. sont géré par une bdd sqlce
Téléchargement asynchrone avec BeginReceive
à chaque fois que ma callback est appelée j' "Invoke" un délégué qui va écrire ce qui a été téléchargé, donc ~BUFFER_SIZE dans un fichier, pour l'instant mon BUFFER_SIZE est de 3500 octets.
Ca veut dire que a chaque fois qu'un paquet est reçu je lui intime l'ordre d'écrire directement mes 3500 octet dans un fichier.
[mode j'aime bien emmètre des doutes sur des choses évidentes]
Je pense qu'il faut que je limite un maximum mon nombre de traitement dans mon callBack déjà, pensez vous que l'appel à Invoke surchage ma callback ? a priori non ?
[/eoj]
Est-ce que je ne devrais pas plutôt créer mon propre buffer qui ferait par exemple 10Mo et attendre que celui ci soit rempli pour lancer l'écriture du fichier ?
Le soucis si je fais ca c'est que je risque d'utiliser beaucoup de ram, et si je met par exemple un block_size de 10Mo, ca peut faire super lourd si je met 10 threads par exemple
Enfin voilà c'est pas évident d'arriver à optimiser
J'aurais voulu savoir également pourquoi lorsque je me fais par exemple un tableau de byte de taille 4000 octet, et que je lui dit de me télécharger 4000 octet à l'appel de beginreceive mon tableau est trop petit ?
Quelques bout de mon code :
Callback de téléchargement :
Ecriture du fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 Public Sub callB(ByVal ar As IAsyncResult) Dim current As DBChunk = CType(ar.AsyncState, DBChunk) Dim read As Integer = _socket.EndReceive(ar) If (read = 0) Then _socket.Close() Else Dim index As Integer = 0 If (current.current_byte = current.start_byte) Then Dim s As String = Encoding.ASCII.GetString(_buffer, 0, read) If (s.Contains("HTTP/")) Then index += s.IndexOf(vbCrLf & vbCrLf) + 4 Else MsgBox("ERREUR, pas de GET dans le paquet c'est CHELOU") End If End If Dim de As New DataDownloadEvent(_buffer, read - index) de.CurrentFirstWriteIndex = index Dim r As New received(AddressOf _form.dlm._dm.worker2) de.CurrentChunk = current _form.Invoke(r, New Object() {Me, de}) current.current_byte += read - index _socket.BeginReceive(_buffer, 0, READ_SIZE, SocketFlags.None, AddressOf callB, current) End If End Sub
Je suis ouvert à toute remarque
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Public Sub worker2(ByVal sender As Object, ByVal e As DataDownloadEvent) fs.Seek(e.CurrentChunk.current_byte, SeekOrigin.Begin) fs.Write(e.Received, e.CurrentFirstWriteIndex, e.ByteReceived) fs.Flush() RaiseEvent DataReceived(Me, New DataDownloadEvent(e.ByteReceived)) End Sub
Partager