質問内容
質問を評価する
(0ポイント)
|
現在、スレッドを使って処理を分散させるプログラムで 出力を行っています。 ソースコードは以下(少々書いたままにしておくと支障 の出るところは省いています)
private void complementMoveDatas() { // データを補完して別の場所に! // TODO 自動生成されたメソッド・ス タブ File picked_f = FilePathUtil.getPickedDataDir(); ac_dirs = picked_f.listFiles(); int ac_num = ac_dirs.length; -------------------1ここから----- ----------- File test_dir = FilePathUtil.getTestDir(); File f = new File(test_dir, "notData.txt"); BufferedWriter ndo=null; try { ndo = FileUtils.getBufferedWriter(f, false); if(ndo==null){ Log.d("ndo", "null"); } } catch (FileNotFoundException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } if(!test_dir.exists()){ test_dir.mkdirs(); } -------------------1ここまで----- ---------- int ar = Runtime.getRuntime().availableProcessors(); System.out.println("availableProcessors: " + ar); ExecutorService exec = Executors.newFixedThreadPool(1); long time1 = System.currentTimeMillis(); File comp = FilePathUtil.getComplementedFilesDir(); if(!comp.exists()){ comp.mkdirs(); } for(int ac_count = 0; ac_count < ac_num; ac_count++){ Log.d("ac: "+ ac_dirs[ac_count].getName()); for(int day = 0; day<6; day++){ File id = getImageFileDir(day); if(!id.exists()){ id.mkdirs(); } int count_num = (new File(ac_dirs[ac_count]+"/MoveData/"+DAYS[day]+"/en rollment/").listFiles().length) + 1; for(int count = 1; count<count_num; count++){
for(int action = 0; action<ACTION_NUM; action++){ final int a_c = ac_count; final int phase = action; final int c = count; final int d = day;
exec.execute(new Runnable() { @Override public void run() { // TODO 自動生成されたメソッド・スタブ Log.d("ac: "+ ac_dirs[a_c].getName()+" "+c +" "+d); //Log.d(f); String user_name = ac_dirs[a_c].getName(); File mdf = getMoveDataFile(ac_dirs[a_c], d, c, phase); //System.out.println("mdf: " + mdf); MoveData md = new MoveData(mdf); File out_dir = new File(FilePathUtil.getComplementedFilesDir(), user_name); if(!out_dir.exists()){ out_dir.mkdirs(); } mdf = new File(out_dir, "original-"+d+"-"+c+"- "+phase+".txt"); //mdf = new File(FilePathUtil.getTestDir(), "test.txt"); -------------2ここから--------------- if(md.comfirmIsData(AppUtils.getFingerNumber(phase ))){ try { md.outputMoveData(mdf); md = new MoveData(mdf); if(1<phase && phase < 23 || phase>28){ md.complementTouchPointDatas(); mdf = new File(out_dir, "comp-"+d+"-"+c+"- "+phase+".txt"); //mdf = new File(FilePathUtil.getTestDir(), "test2.txt"); md.outputMoveData(mdf); md = new MoveData(mdf); md.setStartEnd(AppUtils.getFingerNumber(phase)); md.setpId_(); mdf = new File(out_dir, "processed-"+d+"-"+c+"- "+phase+".txt"); md.outputMoveData(mdf); File image_dir = FilePathUtil.getComplementedImagesDir(); if(!image_dir.exists()){ image_dir.mkdirs(); } File image = new File(image_dir, phase+"- "+user_name+"-"+d+"-"+c+".png"); //File image = new File(FilePathUtil.getTestDir(), "test.png"); // ImageIO.write(md.getBufferedImage(), "png", image); mdf = new File(out_dir, "statistics-"+d+"-"+c+"- "+phase+".txt"); md.writeStatisticsAuthValues(mdf); }else if(phase<2){ md.setStartEnd(AppUtils.getFingerNumber(phase)); md.setpId_(); mdf = new File(out_dir, "seted-"+d+"-"+c+"- "+phase+".txt"); md.outputMoveData(mdf); md.complementTouchPointDatas(); md.setStartEnd(AppUtils.getFingerNumber(phase)); md.setpId_(); mdf = new File(out_dir, "processed-"+d+"-"+c+"- "+phase+".txt"); md.outputMoveData(mdf); //md.writeStatisticsAuthValues(mdf); File image_dir = FilePathUtil.getComplementedImagesDir(); mdf = new File(out_dir, "statistics-"+d+"-"+c+"- "+phase+".txt"); md.writeStatisticsAuthValues(mdf); } } catch (FileNotFoundException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } --------------2ここまで-------------- }else{ ---------------3ここから----------------- String str = out_dir.getName()+"-"+d+"-"+c+"- "+phase+StringProperty.getLS(); try { BufferedWriter memo = FileUtils.getBufferedWriter( FilePathUtil.getIsDataMemo(), true); memo.write(str); memo.flush(); memo.close(); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } //System.out.println("run: "+phase); --------------3ここまで----------------- } }); } } } }
try{ exec.shutdown();
if(!exec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS)); } catch (InterruptedException e){ System.out.println("awaitTermination interrupted: " + e); exec.shutdownNow(); } long time2 = System.currentTimeMillis(); System.out.println(time2 - time1); } ※「-----1ここから------」といったように書いた 部分は説明のためのもので、実際のコードには存在しま せん。 仕組みとしては,1でログファイルを BufferedWriter(変数名ndo)で開きます.これはミスで 開きっぱなしになっていました. そして,2の部分でログファイルとは違うファイルを 読み込み,オブジェクトを生成.そのオブジェクトが 「処理すべきデータ」であれば (if(md.comfirmIsData(AppUtils.getFingerNumber(pha se))) 部分で判定)しかるべき処理を行い,ログファ イルとは違うファイルに処理を施したものを書き出しま す.このファイルは生成されるオブジェクトごとに決ま る名前のファイルになります。 3では2でオブジェクトが「処理すべきデータ」でな い場合は,ログファイルFilePathUtil.getIsDataMemo() に出力します。これは1で開いたものと同じログファイ ルをどのスレッドでも開きます. このコードを書いてからあとで気づいたのですが、3 にて,ログファイルを開くタイミングなどが競合した場 合,どうなるのでしょうか。そのまま同時に書き込まれ るか,処理がストップするのでしょうか。2で出力され るべきファイル群に影響は出ますでしょうか. ちなみに、このあと1にてndoがクローズされ,また ログファイルがない場合はフォルダも含めて作成される ように書き換え,またFilePathUtil.getIsDataMemo()で もスレッドごとに個別のログファイルに書きだすように 変えましたが,この場合に2で出力されるべきファイル 群が修正前より変化するということはありえるでしょう か?
別に修正前に競合していても、処理が止まらず、修正 後と同じデータが出ていればいいのですが、生憎実行す るためには時間のかかる作業が別途必要になります. 申し訳ありませんが、皆様のお知恵から、アドバイス をお願い致します。
|