首頁 > Java > 主體

為什麼在 aws-sdk-go 中動態設定檔案大小並儲存在記憶體中 getObject 需要更長的時間?

PHPz
發布: 2024-02-08 22:15:33
轉載
695 人瀏覽過

在使用 aws-sdk-go 進行檔案操作時,有時我們需要動態設定檔案大小並將其儲存在記憶體中。然而,當我們使用 getObject 方法來取得這個檔案時,可能會發現取得時間較長。這是因為在 aws-sdk-go 中,getObject 方法是基於 HTTP 協定的,而 HTTP 協定對於大檔案的傳輸需要更多的時間和資源。因此,當我們動態設定檔案大小並儲存在記憶體中時,可能會導致 getObject 方法的執行時間變長。為了減少這種情況的發生,我們可以考慮使用其他更適合大檔案傳輸的方法,例如分段下載或使用多執行緒下載等。

問題內容

我嘗試理解ForkJoinPool。我實際上不明白 fork 方法在沒有 join 和結束條件的情況下做什麼。 如果fork發送一個要在佇列中執行的任務,那麼為什麼這段程式碼不會無限地運行呢?

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

public class Main {

    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        pool.invoke(new Test());
    }

    static class Test extends RecursiveAction {

        @Override
        protected void compute() {
            System.out.println(Thread.currentThread().getName());
            Test test = new Test();
            test.fork();
        }
    }
}
登入後複製

結果總是不同的。

第二個問題:如果你在計算中呼叫 self fork 會發生什麼事?

@Override
protected void compute() {
      System.out.println(1);
      fork();
}
登入後複製

計算將會被呼叫 1 或 2 次。

或這個:

protected void compute() {
      System.out.println(1);
      fork();
      join();
}
登入後複製

計算將會呼叫多次,然後停止。

解決方法

確實無限地運行,但它們守護執行緒不會阻止JVM 關閉,因此它們會在主執行緒完成後(即立即關閉)關閉。設定一個無限循環來阻止主執行緒完成,您將看到您的任務無限進行。

public static void main(String[] args) {
    ForkJoinPool pool = new ForkJoinPool();
    pool.invoke(new Test());
    while (true) {}
}

static class Test extends RecursiveAction {

    @Override
    protected void compute() {
        System.out.println(Thread.currentThread().getName());
        Test test = new Test();
        test.fork();
    }
}
登入後複製

以上是為什麼在 aws-sdk-go 中動態設定檔案大小並儲存在記憶體中 getObject 需要更長的時間?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板