drain @autoreleasepool?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • drain @autoreleasepool?

    Hallo,

    gibt es wirklich keine möglichkeit einen @autoreleasepool manuell zu entleeren?

    ich habe zb eine collection mit 100.000 objekten welche ich iteriere und mit jedem objekt etwas anstelle das einiges an speicher verbraucht.
    bisher habe ich zb immer nach 1.000 durchläufen den pool zerstört und einen neuen erstellt.
    Mit @autoreleasepool scheint das ja nicht möglich zu sein. (nein, ich möchte nicht 100.000 autorelease pools ;-))
  • gritsch schrieb:

    macmoonshine schrieb:

    Da musst Du wohl mit verschachtelten Pools arbeiten; notfalls die Schleife künstlich unterteilen.


    bei einer schleife in der einfach zahlen inkrementiert werden ja kein problem, aber wie teilt man zb folgendes vernünftig auf:

    Quellcode

    1. ​for (NSURL *tmpFileURL in paths)

    Mit einem Enumerator.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Ja, mir ist klar was du willst. Und die Antwort darauf lautet: Die schließende Klammer von @autoreleasepool. Übrigens weiß ich gar nicht, ob es schlimm wäre, "100.000 ARPs zu haben", weil es keine ARPs mehr gibt. Das ist ein Sprachkonstrukt geworden. Habe ich aber auch noch nie ausprobiert.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Mal was anderes: Hast Du mal a) ausprobiert, wie teuer es ist, jeden Durchgang zu klammern? ARP ist ziemlich schnell. Oder b) probiert, das Zeug gar nicht erst im ARP landen zu lassen, sodass man sich die Zwischenleerungen schenken kann? Wenn's nicht anders geht, kann man natürlich zwei Schleifen schachteln, aber ich hätte da ein doofes Gefühl. Nicht nur wegen der Schleifen, das habe ich immer, wenn ich mir irgendwelche Konstanten ausdenken muss (in diesem Fall also alle 1000 Durchgänge oder so).
    Multigrad - 360°-Produktfotografie für den Mac
  • Mach's halt mit verschachtelten Pools. APL zeigt's sogar in einem Beispiel:

    Quellcode

    1. NSArray *urls = <
    2. # An array of file URLs #>;
    3. for (NSURL *url in urls) {
    4. @autoreleasepool {
    5. NSError *error;
    6. NSString *fileContents = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    7. /* Process the string, creating and autoreleasing more objects. */
    8. }
    9. }


    Was ist eigentlich mit 100.000 Pools gemeint??? Versteh ja gar ned einmal, wie Du die überhaupt mit @autorelease { } gleichzeitig erstellen kannst.
  • mattik schrieb:

    Mal was anderes: Hast Du mal a) ausprobiert, wie teuer es ist, jeden Durchgang zu klammern? ARP ist ziemlich schnell. Oder b) probiert, das Zeug gar nicht erst im ARP landen zu lassen, sodass man sich die Zwischenleerungen schenken kann? Wenn's nicht anders geht, kann man natürlich zwei Schleifen schachteln, aber ich hätte da ein doofes Gefühl. Nicht nur wegen der Schleifen, das habe ich immer, wenn ich mir irgendwelche Konstanten ausdenken muss (in diesem Fall also alle 1000 Durchgänge oder so).

    Das denke ich auch. Immerhin will er ja mindestens ein Objekt in jedem Durchgang erzeugen. Den ARP zu erden, ist inzwischen sehr schnell. Aber wie gesagt: Probiert habe ich es noch nie.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • manoh schrieb:

    Mach's halt mit verschachtelten Pools. APL zeigt's sogar in einem Beispiel:

    Quellcode

    1. NSArray *urls = <
    2. # An array of file URLs #>;
    3. for (NSURL *url in urls) {
    4. @autoreleasepool {
    5. NSError *error;
    6. NSString *fileContents = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
    7. /* Process the string, creating and autoreleasing more objects. */
    8. }
    9. }


    Was ist eigentlich mit 100.000 Pools gemeint??? Versteh ja gar ned einmal, wie Du die überhaupt mit @autorelease { } gleichzeitig erstellen kannst.

    Ach, gehen ginge das schon. (Wenn man überhaupt noch von mehrfachen Pools sprechen will. Das trifft es ja nicht mehr wirklich.)

    Quellcode

    1. - (void)methodWithR:(NSInteger)r
    2. {
    3. @autoreleasepool
    4. {
    5. if (r>0)
    6. {
    7. [self methodWithR:r-1];
    8. }
    9. }
    10. }

    Quellcode

    1. [self methodWithR:100000]
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?