0

Spark を使用してローカルに Alluxio をインストールし、Alluxio のメモリに 1000 個のファイルを挿入しました。
それにもかかわらず、ファイルの読み取りは非常に遅いです。Alluxio メモリからのファイル読み取り時間は、ディスクからのファイル読み取り時間と同じです。理由がわかりません。

File Name   Size    Block Size  In-Memory   Persistence State   Pin Creation Time   Modification Time
file1   54.73KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:278 08-16-2016 12:52:31:372
file2   54.73KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:377 08-16-2016 12:52:31:384
file3   54.72KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:386 08-16-2016 12:52:31:393
file4   54.71KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:394 08-16-2016 12:52:31:400
file5   54.72KB 512.00MB     100%   NOT_PERSISTED   NO  08-16-2016 12:52:31:401 08-16-2016 12:52:31:407
...

ファイル API でデータを読み取ります:

FileSystem fs = FileSystem.Factory.get();
AlluxioURI path = new AlluxioURI(/partition0);
List<URIStatus> status = fs.listStatus(path);
for (int i=0; i<status.size(); i++)
                    {
                        path = new AlluxioURI(status.get(i).getPath());
                        if(fs.exists(path)==true)
                        {
                            FileInStream in = fs.openFile(path);
                            String file = "";

                            InputStreamReader ipsr = new InputStreamReader(in);

                            BufferedReader br=new BufferedReader(ipsr);
                            String line;
                            line=br.readLine();
                            while (line != null){
                                //System.out.println(line);

                                file = file + line;
                                line=br.readLine(); 
                            }

                            byte[] cfv = file.getBytes();
                            br.close();
                            // Close file relinquishing the lock
                            in.close();
                        }
                    }

1000 個のファイルを含むパーティションを読み取るテストが非常に遅いため、今のところ Spark は使用しません (将来的には、Spark を使用してパーティションごとにファイルを読み取りたいと考えています)。

このメソッド/ライブラリを使用して時間を読み取るのが遅いのはなぜですか?

4

2 に答える 2

2

あなたの例では少しずれていることがいくつかあります。

まず、ファイルに表示される情報は、ファイルがそれぞれ約 50 kB と非常に小さいことを示唆していますが、Alluxio は 512 MB ブロックを使用するように構成されています。これは、実際に必要な量よりもはるかに多くのデータを転送していることを意味する可能性があります。したがって、考慮すべきことの 1 つは、主に小さいファイルを使用する場合は、はるかに小さいブロック サイズを構成する方がよいということです。

次に、テスト ケースで実際にファイルを読み取る方法は、恐ろしく非効率的です。文字列連結を使用してファイルを作成し、それをバイトに変換して、行ごとに文字列として読み取ります。したがって、メモリ内のバイトから文字列に移動し、次にバイトに戻ります。さらに、文字列連結を使用することで、これまでに読み取ったファイル全体を、読み取った追加の行をメモリにコピーすることを強制しています。

通常、ファイルを 1 行ずつ読み取りStringBuilder/ 別のファイルに書き込むWriterか、ファイルをバイト単位で読み取り / 別のファイルに書き込むかのいずれかです (byte[]たとえばOutputStreamByteArrayOutputStream最終的に を取得したいがbyte[]事前にサイズがわからない場合)。

3 つ目の考慮事項は、クラスター内でコードが実行される場所です。ファイルがメモリ内にある場合でも、クラスタ内のすべてのノードのメモリ内にあるとは限りません。ファイルがまだメモリにないノードからファイルを読み取る場合は、ネットワーク経由でファイルを読み取る必要があり、その時点でパフォーマンスが低下します。

最後の考慮事項は、OS ファイルのキャッシュです。テスト ファイルを生成してすぐにテストを実行した場合、これらのファイルは OS によってメモリにキャッシュされる可能性があります。この時点で、キャッシュは OS レベルで行われるため、Alluxio よりも優れたパフォーマンスが得られるわけではありません。本当に意味のある比較を行いたい場合は、ファイルベースのテストを実行する前に、OS ファイル キャッシュを確実にフラッシュする必要があります。

于 2016-08-17T09:18:33.213 に答える
0

いくつかのテストの後、ファイルのサイズが読み取り時間の主な問題です。ファイルが小さいと、読み取り時間が 20 倍以上になる可能性があります。ブロックのサイズも読み取り時間に影響し、読み取り時間が約 1% 増加する可能性があります。

于 2016-08-23T07:37:07.983 に答える