-
Upload Speed Problem
Ich hoffe, das einer von euch mir helfen kann. Bei Stackovflow hiess es bisher nur: Das kann viele Gründe haben (you don't say)
Mein Upload Tool erreicht bei Uploads zu Google (andere Dienste hab ich noch nicht implementiert) auf allen Geräten "nur" eine Geschwindigkeit von ca 200Mbps. Dabei ist es egal, ob ich 5 oder 20 Files paralell uploade.
Wenn ich hingegen das Tool 5 mal starte und 5 mal 5 Dateien paralell hochlade, erreiche ich die GBit Grenze.
Irgendjemand ein Hauch einer Idee wer da limitiert? Google kanns kaum sein, da sie nicht unterscheiden können ob der Upload von einer neuen Instanz oder einem neuen Thread innerhalb der gleichen Instanz, kommt.
Vielleicht Haze ;)
-
Vermutlich teilen sich die parallelen Uploads eine Ressource/Instanz. Keine Ahnung wie genau du das implementiert hast, daher spekuliere ich einfach mal. Das kann irgendetwas sein, was die Verbindungen handelt oder es liegt womöglich daran, dass du dich nur einmal bei Google authentifizierst pro Instanz des Programms (quasi 1 authentifizieren und 5x uploaden vs. 5x authentifizieren und 5x uploaden)
-
Das war auch meine erste Vermutung, deshalb ist das nun nicht mehr so. Jeder Upload authentifiziert sich bei Google. Aber natürlich läuft alles in der selben exe (instanz).
-
Connectiontion-pooling, cookies, .... sind ein paar der faktoren, die hier dazu spielen. Ohne konkreten Code ist das nahezu unmöglich zu sagen. Kannst du hierzu noch futter liefern?
-
Du kannst versuchen mehrere anonyme Threads zu starten. Erstmal ohne Rückmeldung. Wenn du dann vollen Speed hast, bau darauf auf.
Es könnte aber auch die Verwaltug/Overhead sein die drosselt.
Es kann wirklich viel sein.
-
Ich hab nun eben gesehen, dass der z_o_o_m Uploader bei Google exakt das selbe Problem hat :emoji50: Und das nur bei GD.
Ist also doch irgendwie ein GD Problem.
Hier mal der Code
Ein Upload eines Files (Auszug)
Code:
Dim service = newGDService()
Dim uploadStream As FileStream
uploadStream = File.OpenRead(localpath)
Dim insertrequest As FilesResource.CreateMediaUpload = New FilesResource.CreateMediaUpload(service, body, uploadStream, mimeType)
AddHandler insertrequest.ProgressChanged, Sub(e As IUploadProgress) GD_UploadProgressChanged(e, Id)
insertrequest.ChunkSize = 256 * 4 * 1024 * chunksize_
Dim answer = insertrequest.Upload()
uploadStream.Dispose()
Code:
Function newGDService()
' Create Drive API service.
Dim service As DriveService
Using stream = New FileStream(System.AppDomain.CurrentDomain.BaseDirectory + "client_secret.json", FileMode.Open, FileAccess.Read)
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, New FileDataStore(credPath, True)).Result
End Using
service = New DriveService(New BaseClientService.Initializer() With {.HttpClientInitializer = credential, .ApplicationName = "simpleGDM"})
Return service
End Function
-
Mich verwirrt doch immer wieder das "C#"-Tag und der VB-Code ....
Kannst du nen converter empfehlen?
-
Ich kann kein VB Tag setzten das das nicht gibt :emoji28: Und das Problem ist ja in C# das selbe :D
Und ja Code Converter ist recht gut.
Code:
dynamic service = newGDService();
FileStream uploadStream = default(FileStream);
uploadStream = File.OpenRead(localpath);
FilesResource.CreateMediaUpload insertrequest = new FilesResource.CreateMediaUpload(service, body, uploadStream, mimeType);
dynamic answer = insertrequest.Upload();
uploadStream.Dispose();
Code:
public object newGDService()
{
// Create Drive API service.
DriveService service = default(DriveService);
using (stream == new FileStream(System.AppDomain.CurrentDomain.BaseDirectory + "client_secret.json", FileMode.Open, FileAccess.Read)) {
credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.Load(stream).Secrets, Scopes, "user", CancellationToken.None, new FileDataStore(credPath, true)).Result;
}
service = new DriveService(new BaseClientService.Initializer {
HttpClientInitializer = credential,
ApplicationName = "simpleGDM"
});
return service;
}
- - - - - - - - - - Beitrag nachträglich erweitert - - - - - - - - - -
Aber da das Problem anscheinend doch Google bedingt ist (z_o_o_m Vergleich), kann ich das Problem nun versuchen anzugehen.
Ich bin ja schon mal froh zu wissen, das dort das Problem liegt.
Die neue Frage lautet: Wie merkt Google, dass ich von der selben Instanz komme?
Also ob die obrige Funktion im thead 4 von instanz a oder im thead 22 von instanz b läuft?
Denn eben die 200Mbit sind ja pro Instanz.
Wenn ich nichts finde muss ich halt den Upload in eine eigene exe outsourcen, die als windowsdienst im Hintergrund läuft und den Uploadstatus an die main exe weitergibt. Ich wäre aber froh, wenn ich das in einer exe lösen könnte.
-
Falls du auf Google Drive uppst, die haben ein Speedlimit.
Mehr wirst du nicht erreichen.
-
Natürlich erreiche ich mehr ;-) bis zu 2.5Gbit (mehr konnte ich nicht testen). Dazu muss mein Tool nur paralell laufen. Und genau das verwundert mich so.
https://www.szenebox.org/images/_imp...016/08/152.jpg
rot 1 instanz blau 5 instanzen
-
Könnte jetzt falsch liegen da ich nur Grundkenntnisse in C# habe aber hast du versucht für jede Datei die du hochladen willst eine neue " newGDService(); " zu erstellen ?
// keine Garantie das das funktionieren wird - hab nur Grundkenntnisse
-
Genau so wird das gemach :)
Ich hol mir für jeden Fileupload eine neue Zugrifsberechtigung, obwohl das nicht notwendig wäre.
Zuerst hab ich das nur beim Start einmalig gemacht, es dann aber geändert, da ich wie du annahm das würde helfen.
-
Ich kenne mich mit VB nicht und mit .NET nur wenig aus. Was mir aber auffällt ist, dass hier bisher gar nicht richtig zwischen deinen beiden Testfällen unterschieden wurde. Mehrere Threads sind schließlich etwas anderes als mehrere vollkommen unabhängige Prozesse. Ich vermute, dass dir die .NET-Runtime einen Strich durch die Rechnung macht.
Hast du mal versucht, mit Wireshark o.Ä. zu untersuchen, ob dein Programm überhaupt alle Verbindungen "gleichzeitig" aufbaut? Ich vermute, dass zu einem Zeitpunkt immer nur ein Teil deiner Uploads läuft und der Rest warten muss.
Eine andere Frage: Benutzt du HTTP(S) für die Uploads?
-
Das Problem hat sich geklärt. Google beschränkt hier bei 200Mbit.
Bei meinen Test lud ich leider die selbe Datei paralell hoch und dann greift die Speedbegrenzung nicht. Das ist zwar auch etwas seltsam, aber es hilft mir natürlich nichts, da man nichts davon hat, wenn man eine Datei mehrfach hochlädt ;)
Bei dem Test mit multithreads wurden hingegen verschiedene Dateien hochgeladen.
-
Nein es ist ja genau anders rum beim Upload der selben Datei war der Speed unlimitiert, beim Upload verschiedener Daten ists limitiert.
EDIT: Ich bin heute noch verwirrter als gestern, es waren sehr wohl exakt die gleichen Dateien einfach mehrfach ausgelesen.