2013-12-12 3 views
0

В моем проекте мне нужно создать агент для пользователей, а агент включает несколько банок (около 22 М), некоторый исходный класс (около 200k) и XML. Сервер будет генерировать разные xml для дефференциального пользователя, поэтому мне нужно генерировать агент динамически. Я использовал Runtime.getRuntime().exec("tar...") для tar-файлов для создания агентов.

Когда я запускаю модульный тест, генерация стоит много времени, около 2 минут для каждого агента. Я не могу позволить пользователю подождать страницу в течение 2 минут ... так ли это вообще существует, чтобы сделать эту программу более эффективной, или есть другой способ быстро и плавно генерировать агент? оценить!использует Java для запуска команды «tar», но для генерации tar-файла стоит много времени.

/** 
    * tar the agents 
    * @param inputFiles agent files 
    * @param outputFile agent tar 
    * @param baseDir the directory path to run "tar" command 
    */ 
public static void tarFile(String[] inputFiles,String outputFile,String baseDir){ 
    String cmd="tar -zcf "+outputFile+" "; 
    for (int i = 0; i < inputFiles.length; i++) { 
     cmd+=inputFiles[i]+" "; 
    } 
    System.out.println(cmd); 
    try { 
     Process process=Runtime.getRuntime().exec(cmd, null, new File(baseDir)); 
     BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(process.getInputStream())); 
     String s; 
     while ((s=bufferedReader.readLine())!=null) { 
      System.out.println(s); 
     } 
     process.waitFor(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

это мой класс дегтя, то пары - имя_базовой_папки это задать пути исполнения команды

+0

Сжимаете ли вы его? – Brandon

+0

Вы пытались нарезать резьбу, чтобы извлекать файлы одновременно? – elyashiv

+0

2 минуты для чуть более 22 м очень медленно. Чтобы сделать ваше программное обеспечение более эффективным, вы должны сначала выяснить, почему он так долго. Вероятно, у вас есть ошибка в вашей программе, но без дополнительной информации невозможно сказать больше. – Raedwald

ответ

1

Используйте Apache Commons Compress создать tar архив непосредственно в Java.
См. TarArchiveOutputStream.

Вот полный сервлет, который создает, что tar выход на лету:

import java.io.*; 
import javax.servlet.http.*;  
import org.apache.commons.compress.archivers.tar.*; 
import org.apache.commons.compress.utils.IOUtils; 

public class Web extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
     String[] files = { 
       "/path/to/file1", 
       "/path/to/file2", 
     }; 

     resp.setContentType("application/x-tar"); 
     try (TarArchiveOutputStream out = new TarArchiveOutputStream(resp.getOutputStream())) { 
      for (String name: files) { 
       File file = new File(name); 
       TarArchiveEntry entry = new TarArchiveEntry(file); 
       out.putArchiveEntry(entry); 
       try (InputStream in = new FileInputStream(file)) { 
        IOUtils.copy(in, out); 
       } 
       out.closeArchiveEntry(); 
      } 
     } 
    } 
} 

клиент начнет получать архив мгновенно, без необходимости ждать файл tar быть создан заранее. Кроме того, это не требует записи архива на диск.

1

Мне нужно будет увидеть фактическую команду tar, которую вы передадите Runtime.getRuntime(). Exec.

Есть 4 факторов, которые действительно влияют на скорость архивирования до файлов в тарболл:

  1. скорость процессора на коробке
  2. скорости
  3. I/O на поле
  4. Количества исходных данных для Архив
  5. Compression

rzymek указал, что вы можете использовать Apache Commons Компресс для создания файла изначально. Однако я не уверен, что это будет быстрее, если мы не поймем, что такое ограничение из командной строки.

Если вы просто используете его, используя скорлупу, скорость сопоставима? Если это так, попробуйте уменьшить коэффициент сжатия или даже полностью отключить его (удаление опции «z» в tar czf).

Если вы сжимаете tar-файл и его необходимо сжать, то если XML небольшой, вы можете предварительно сжать файлы JAR (я думаю, что они уже сжаты, если я помню, но вам может потребоваться проверить степень сжатия), а затем сделать tarball несжатым, так как сжатие сжатого файла ничего не выполняет (а иногда и медленнее!)

+0

Я вставляю свой код выше, пожалуйста, дайте мне любой совет, который вы знаете, спасибо! вы отмечаете, что удаление опции «z», я тестирую новую команду, она не работает быстро, также стоит около 2 минут. –

+0

. Это говорит о том, что сжатие не является источником медленного ответа. Насколько велика результирующий файл после удаления опции z? – Brandon

+0

около 24.5M. if add z option, about 22M –

 Смежные вопросы

  • Нет связанных вопросов^_^