Announcement

Collapse
No announcement yet.

Speed limitieren - Datei kopieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Speed limitieren - Datei kopieren

    Hi
    Wirs das Thema schon sagt, will ich die Geschwindigkeit beim Kopieren von Dateien Limitieren...

    Hab schon versucht das über die Zeit einzugrenzen, aber das hat alles nicht so recht geklappt, da er dann am anfang der sekunde gas gibt und hinten Schläft...

    Hab keine Idee mehr. Weiß einer wie das korrekt zu laufen hat ?

    Danke für jeden Tipp

  • #2
    Hallo,

    wie willst du denn das Limitieren? Bytes/s?
    Ohne etwas mehr Infos kann dir kaum einer helfen.

    Schau dir aber zur Sicherheit mal die Timer an.

    Wozu soll das überhaupt gut sein? Jeder will so schnell wie möglich und du willst bremsen


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Speed limitieren kann schon Sinn machen, wenn man z.B. die schwache Internetanbindung nicht komplett blockieren will. Bei Filesharing-Clients (z.B. Azureus) oder Kopierprogrammen wie WinScp gibt es dazu Felder, wo man den Speed einstellen kann. Meine Idee dazu wäre, eine Puffergröße z.B. 1024Bytes also 1KB zu nehmen und immer, wenn der Puffer versendet wurde, in der Klasse, die fürs Kopieren zuständig ist, Thread.sleep aufzurufen
      http://www.winfonet.eu

      Comment


      • #4
        Nach dem letzten Stand ist es ein Filecopy.....
        Christian

        Comment


        • #5
          Naja ich muss das kontrollieren ob ich überm limit bin oder nicht... und wie schon gesagt hab ich ham anfang der sekunde vollspeed und am ende pause das kanns ja nich sein oder ?

          Cracker0dks

          Comment


          • #6
            Was für ein Limit?? Zeit, Menge?
            Christian

            Comment


            • #7
              Ich weill die Menge Pro Sekunde begrenzen.
              und dann möglichst den Traffic auf die Sekunde verteilen, und nicht wie oben beschrieben am anfang gas und dann schlafen

              Comment


              • #8
                Hallo,

                was verstehst du unter Menge. Das was ich eingang schon gefragt habe und darauf nocht nicht geantwortet hast?


                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  keiner weiss was du progammiert hast, und was du erreichen willst. Mit der wiederholten Aussage

                  am anfang der sekunde gas gibt und hinten Schläft...
                  kannst wohl nur du was anfangen.

                  Wie wäre es du gehst mal darauf ein, was hier gefragt wird.

                  Warum überlässt du das nciht dem Betiebssytem, wenn es um ein FileCopy geht?
                  Zuletzt editiert von Christian Marquardt; 31.08.2010, 18:23.
                  Christian

                  Comment


                  • #10
                    Ja. Dateiübertragung Menge=Kb,MB und dann

                    Wenn ich jetzt zb vom Benutzer die Begrenzung 100Kb/s als eingabe bekomme! und jetzt zähl ich am anfang der Sekunde mit.
                    Dann hab ich nach sagen wir 1/2 Sekunde 100KB übertragen.... so....

                    damit jetzt die Geschwindigkeit passt müsste ich eine halbe Sekunde nix machen

                    Aber das is ja nicht das Gelbe vom EI!

                    Danke für tipps

                    PS:
                    Warum überlässt du das nciht dem Betiebssytem, wenn es um ein FileCopy geht?
                    Wenn du mir sagen kannst wie... dann gerne!
                    Zuletzt editiert von cracker0dks; 31.08.2010, 20:16.

                    Comment


                    • #11
                      Du müsstest es halt in kleineren Häppchen machen. Also z.b. bei gewünschten 100k/sec 10k kopieren, 100 msec - Kopierdauer warten, 10k kopieren, 100 msec - Kopierdauer warten usw.

                      Ob das so gut funktioniert ist fraglich. Der Durchsatz bei lokalen Dateioperationen schwankt extrem. Windows verschätzt sich da ja auch ständig mit der verbleibenden Restdauer bei Kopieroperationen v.a. bei sehr vielen kleinen Dateien. Eigentlich müsstest Du die Werte und die Puffergröße beim kopieren optimieren, was aber nur geht, wenn Du die verfügbare Gesamtbandbreite kennst. Die kannst Du aber aus genannten Gründen nicht zuverlässig messen.

                      Du kannst auch mal nach "bandwith limiting Java" googeln und wirst feststellen, das man sowas beliebig kompliziert implementieren kann. Wie ngomo schon sagt macht man das normalerweise bei Netzwerkverbindungen und begrenzter Internetbandbreite und da klappt es auch sehr gut und man kann die verfügbare Bandbreite aufteilen. Ich wüsste auch nicht warum man eine Kopieroperation auf eine fixe Geschwindigkeit limitieren will. Mach es wie Christian sagt, kopiere so schnell wie möglich und überlaß den Rest dem Betriebssystem. Das sorgt schon dafür, das bei parallelen Kopieroperationen alle so schnell wie möglich fertig werden.

                      Comment


                      • #12
                        Wenn du mir sagen kannst wie... dann gerne!
                        Man kann sich dazu jetzt eine Menge überlegen -> siehe ngomo und Alwin. Aber für eine Kopieroperation auf FileCopy-Baisis auf dem lokalen Rechner ist das in meinen Augen kompletter Unsinn. Hier sorgt das Betriebssystem und das Betriebsystem der Festplatten für Optimierung. Das man da etwas tun musste ist 20 Jahre her.
                        Allenfalls dreht man der Priorität des Threads und stzt diesen runter.
                        Christian

                        Comment


                        • #13
                          Ok zu
                          Ich wüsste auch nicht warum man eine Kopieroperation auf eine fixe Geschwindigkeit limitieren will.
                          Nehmen wir an du bist auf einer Lan und willst 500gig SPiele kopieren, aber wenn du den Vorgang startest, kannst (ich mit meinem PC) nichmehr spielen... dehalb wäre es Sinnvoll wenn man den Speed Limitieren könnte, damit man wieder einen anständigen Ping bekommt

                          Allenfalls dreht man der Priorität des Threads und stzt diesen runter.
                          Müsste ich erst testen ob das schon genügt.

                          Kann ich die Priorität eines Threads auch wärend der laufzeit des Threads verändern ? gibt es da irgend eine Möglichkeit?

                          Warum hab ich die abstufungen der Prioriäten von 1-10 ? bei Windows sind es nur 6 (im Taskmanager) welcher Stufe entspricht welche ZahL?

                          Echtzeit:
                          Hoch:
                          Höher als Normal:
                          Normal:
                          Niedrieger als Normal:

                          weiß das einer ?

                          Danke

                          Comment


                          • #14
                            Nehmen wir an du bist auf einer Lan und willst 500gig SPiele kopieren, aber wenn du den Vorgang startest, kannst (ich mit meinem PC) nichmehr spielen... dehalb wäre es Sinnvoll wenn man den Speed Limitieren könnte, damit man wieder einen anständigen Ping bekommt
                            Da würde ich erstmal schauen was denn der Flaschenhals ist. Ist es die CPU? Sorge dafür das Dein Kopierprogramm nur einen Thread verwendet, dann ist maximal ein Kern zu 100% dicht und der oder die anderen sind zum spielen frei. Starte Dein Kopierprogramm mit niedriger Prozesspriorität unter Windows, wenn das nicht reicht. Diese hat erstmal nichts mit der Threadpriorität in Java zu tun.

                            Ist es die Platte? Installiere Dein Spiel auf einer Platte auf die nicht kopiert wird.

                            Du kopierst im LAN und das Netzwerk ist durch den Kopiervorgang langsam? Begrenze die Netzwerkbandbreite des Kopierprozess, entweder mit den TCP/IP settings spielen oder ein Tool wie NetLimiter benutzen.

                            Selbst programmieren würde ich sowas nicht.

                            Comment


                            • #15
                              Klasse, die das macht

                              Moin,

                              ich hab mal Alwins Idee in eine kleine Beispielklasse gegossen. Die kannst Du in Deinem Code verwenden. Die Methode "public void copyLimited(final InputStream in, final OutputStream out)" ist so generisch, dass Du von File nach File oder von Netzwerk nach File oder File nach Netzwerk oder was auch immer kopieren kannst.

                              Code:
                              import java.io.IOException;
                              import java.io.InputStream;
                              import java.io.OutputStream;
                              
                              /**
                               * Eine Klasse, die Daten von einem {@link InputStream} in den Puffer
                               * {@link SpeedLimiter#buffer} liest und von dort in einen
                               * {@link OutputStream}
                               * schreibt. Die Größe des Puffers ergibt sich aus einem angegebenen speed
                               * limit, dass bei der Instanzierung der Klasse übergeben wird und einem Wert,
                               * der angibt, wie oft pro Sekunde das speed limit überwacht werden soll.
                               */
                              public class SpeedLimiter {
                              
                                /**
                                 * Anzahl Milisekunden pro Sekunde
                                 */
                                private static final int MILIS_PRO_SEKUNDE = 1000;
                              
                                /**
                                 * Wird benutzt, um von Kilobytes in Bytes umzurechnen.
                                 */
                                private static final int BYTES_PRO_KILOBYTE = 1024;
                              
                                /**
                                 * Länge des Zeitintervalls, das benötigt wird, die Daten zu übertragen,
                                 * wenn der Speed genau das limit trifft.
                                 */
                                private final int intervalMilis;
                               
                                /**
                                 * Das byte array, dass als Puffer für die Kopieroperation genutzt wird.
                                 */
                                private final byte[] buffer;
                              
                                /**
                                 * Konstruktor, der alle erforderlichen members initialisiert.
                                 * 
                                 * @param limit
                                 *            das speed limit in KB/s, muss größer als 0 sein.
                                 * @param intervalCount
                                 *            gibt an, wie oft pro sekunde geprüft werden soll, ob gewartet
                                 *            werden muss, muss größer als 0 und kleiner/gleich 1000 sein.
                                 */
                                public SpeedLimiter(final double limit, final int intervalCount) {
                              
                                  this.intervalMilis = MILIS_PRO_SEKUNDE / intervalCount;
                              
                                  /*
                                   * Limit ist in KB/s angegeben. Um auf Bytes pro intervall zu kommen,
                                   * müssen wir mit BYTES_PRO_KILOBYTE multiplizieren und durch
                                   * INTERVAL_COUNT dividieren. Das ist dann die Anzahl bytes pro
                                   * Zeitintervall, die wir versenden dürfen, ohne das limit zu
                                   * überschreiten und das nehmen wir als Größe für usneren Puffer
                                   */
                                  final int bufferSize = (int) (limit * BYTES_PRO_KILOBYTE / intervalCount);
                              
                                  this.buffer = new byte[bufferSize];
                                }
                              
                                public void copyLimited(final InputStream in, final OutputStream out)
                                  throws IOException, InterruptedException {
                              
                                  while (in.read(this.buffer) > 0) {
                                    final long startTimeOfThisRun = System.currentTimeMillis();
                                    out.write(this.buffer);
                                    final long restTimeForThisRun = this.intervalMilis - (System.currentTimeMillis() - startTimeOfThisRun);
                              
                                    if (restTimeForThisRun > 0) {
                                      /*
                                       * Wir haben noch Zeit übrig, wir waren also zu schnell, wir
                                       * müssen warten, um das limit nicht zu überschreiten.
                                       */
                                      Thread.sleep(restTimeForThisRun);
                                    }
                                    /*
                                     * Wenn wir keine Zeit mehr übrig haben, waren wir sowieso zu
                                     * langsam, haben das limit deswegen nicht überschritten und müssen
                                     * auch nicht warten.
                                     */
                                  }
                                }
                              }
                              Gruß ngomo
                              http://www.winfonet.eu

                              Comment

                              Working...
                              X