10

アプリにドラッグされている曲を処理するアプリを作成しています。を使用しfile.sizeてファイルのサイズを取得すると、この値を取得するのに約1500ms(avg)かかります。もっと速い方法はありますか?時間(およびメモリ)がかかる理由は理解していますが、HTML5でファイルを処理するのは初めてなので、プロセスを高速化できるかどうかわからないことがあるかもしれません。

同じことがファイルシステムAPIにも当てはまります。それを介してファイルを呼び出して呼び出すとfile.size、同様の時間がかかります。

PSconsole.time()コードを追加することで、この結論に達しました。

これがコードです(大幅に削除されています)

fileSystem.root.getFile(id, {}, function(fileEntry) {
    fileEntry.file(function(audioTemp) {
        console.time(1);
        console.log(audioTemp.size);
        console.timeEnd(1)
    });
});

これはファイルシステムAPIの例です。これは(明らかに)idそれが機能するためにそこにあるという名前のファイルを必要とします。以下はD&Dファイルの入力コードです

function onChangeAddSongsInput() {
    var files = document.getElementById('addSongsInput').files;
    for(var i=0; i<files.length; i++) {
        console.time(1);
        console.log(files[i].size);
        console.timeEnd(1)
    }
}

編集

私はAMDと同等のコア2デュオ、2.7 GHz、2ギガのRAM、win7x64を使用しています。私が信じるスペックは実際には十分にまともです。ですから、私のマシンで何かが十分に時間がかかる場合、私はそれをノーゴーと見なします。

これは、私のアプリの主要なバグ修正のブロッカーです。私は本当にこの長い間修正を含めて出荷したいと思います。バウンティを設定することはできません(まだ)バウンティが設定されるまでに最小限の時間があります。

編集

私はいくつかのテストを行いましたが、クロムがメタデータからサイズを読み取るのではなく、サイズを計算するため、非常に時間がかかります。これがテスト結果です。

ファイルが大きいほど時間がかかり、2回目に呼び出された場合はキャッシュを使用し、ファイルをロードしません。だから今..どうすればこの時間を減らすことができますか?サイズは私のアプリでは重要な情報ですが、ファイルごとにユーザーのアップロード速度を約1.5秒遅くするほど重要ではない可能性があります。ライブラリのインポートを計画していますが、100曲程度追加するときにこの時間を短縮するのに非常に役立ちます。今回は、アプリの応答時間に大きな影響を与えます。

4

2 に答える 2

5

準知識に基づいた推測は次のとおりです。

HTML5Fileインターフェースの定義を見ると、aFileがaBlobであり、size属性が実際にはBlobインターフェースの一部であることがわかります。

aBlobはデータの生のチャンクを抽象化したものであるため、size属性にアクセスすると、実際には実装がファイル全体をメモリにロードする可能性があります。遅延がファイルのサイズによって変化するかどうか、または遅延がsize属性の最初の読み取りでのみ発生するかどうかを確認するための実験を作成できます。

編集

この非効率性はブラウザのインターフェイスの実装に問題があるように感じFileますが、大きなファイルをメモリにロードする際の遅延を回避する方法に関する2つの回避策のアイデアを次に示します。

WebワーカーMDNリファレンスWHATWG Webapps Standard)を使用すると、ファイルの読み込みを遅くして、基本的に別のスレッドに入れることができます。これが最善の策だと思います。

別のアプローチは、インターフェースのsliceメソッドBlobを使用して、の小さな部分をロードすることFileです。の実装がsliceファイルの必要な部分のみをロードする場合、それはより速く進むはずです。Blobファイルごとに複数のスライスをロードする必要があり、によって返されるのサイズに注意して、ファイルの終わりに到達したことを検出する必要がありますslice。仕様から予想よりも小さいblobを取得することで、ファイルの終わりを検出します。

インデックス演算がサイズの境界を超える場合、sliceメソッドはサイズの値をクランプする必要があります。特に、これは、特定のスライス呼び出しに対して次のことを意味します。

start + length> sizeの場合、ユーザーエージェントはslice(start、size-start)が呼び出されたかのようにBlobオブジェクトを返さなければなりません(MUST)。

start> sizeの場合、ユーザーエージェントはサイズ0のBlobオブジェクトを返さなければなりません(MUST)

Blob残念ながら、この仕様では、バッファサイズ外のスライスを要求したときに例外がスローされる可能性についても言及されています。これを行う実装では、ファイルの終わりを検出するために例外をキャッチする必要があります。

于 2011-09-09T14:32:14.890 に答える
-3

Console.Time()で設定した時間を増やすと、パフォーマンスが向上します。ファイルがロードされて表示されるまで、この時間がタイムアウトにならないようにする必要があります。

于 2011-09-08T18:22:26.827 に答える