10

非常に大きな CSV ファイル (1GB 以上) があり、100,000 行あります。

CSV ファイルの各行を解析して、送信する HTTP 要求の本文を作成する Java プログラムを作成する必要があります。

つまり、CSV ファイルの行に対応する 100,000 件の HTTP リクエストを送信する必要があります。これらを単一のスレッドで実行すると、非常に長くなります。

1,000 個のスレッドを作成して、i) CSV ファイルから行を読み取り、ii) 読み取り行の内容を本文に含む HTTP 要求を作成し、iii) HTTP 要求を送信して応答を受信します。

このようにして、CSV ファイルを 1,000 個のチャンクに分割する必要があり、それらのチャンクは互いに重複する行を持たないようにする必要があります。

そのような分割手順の最良の方法は何ですか?

4

6 に答える 6

12

複数の位置で 1 つのファイルを同時に読み取っても、それ以上は速くなりません (ただし、かなり遅くなる可能性があります)。

複数のスレッドからファイルを読み取る代わりに、単一のスレッドからファイルを読み取り、これらの行の処理を並列化します。1 つのスレッドが CSV を 1 行ずつ読み取り、各行をキューに入れる必要があります。次に、複数の作業スレッドがキューから次の行を取得して解析し、要求に変換して、必要に応じて要求を同時に処理する必要があります。作業の分割は単一のスレッドによって行われ、行の欠落や重複がないようにします。

于 2012-06-19T10:20:42.613 に答える
5

CSV の行を読み取り、読み取った行のリストを作成するスレッドを作成できます。これが制限に達すると、たとえば 100 行で固定サイズのスレッド プールに渡され、リクエストとして送信されます。

サーバーに 1000 個のコアがない限り、10 ~ 100 個の同時要求を使用する方が高速であることがわかると思います。

于 2012-06-19T10:18:48.067 に答える
2

CSVラインを取得したら、シングル スレッドでファイルを読み取り、このラインをThread プール内の利用可能なオブジェクトの1 つにデリゲートして、非同期で実行されるオブジェクトを作成し、Runnable Taskそれをに渡します。Executors's submit()

 public static void main(String[] args) throws IOException {

      String fName = "C:\\Amit\\abc.csv";
      String thisLine;
      FileInputStream fis = new FileInputStream(fName);
      DataInputStream myInput = new DataInputStream(fis);
      ExecutorService pool=Executors.newFixedThreadPool(1000);
      int count = 0;  // Concurrent request to Server barrier

      while ((thisLine = myInput.readLine()) != null) {
          if (count > 150) {
              try {
                  Thread.sleep(100);
                  count = 0;
              } catch (InterruptedException e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
          }

          pool.submit(new MyTask(thisLine));
          count++;
      }

    }
}

ここであなたのタスク:

class MyTask implements Runnable {
      private String lLine;
      public MyTask(String line) {
           this.lLine=line;

      }

      public void run() {
          // 1) Create Request  lLine
          // 2) send the HTTP request out and receive response
      }
}
于 2012-06-19T10:30:13.773 に答える
1

ファイルを 1 行ずつ読み取る 1 つのスレッドを作成し、読み取った行ごとにタスクを に投稿して、ExecutorServiceそれぞれの HTTP 要求を実行します。

複数のスレッドからのファイルの読み取りは機能しませんn。行を読み取るには、最初に他のすべてを読み取る必要があるためです。(ファイルに固定幅レコードが含まれている場合、理論的には機能しますが、CSV は固定幅形式ではありません。)

于 2012-06-19T10:19:33.943 に答える