MimeMessage занимает слишком много времени для анализа EML (даже из локального файла) - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь проанализировать EML, используя java почтовый API, используя mimeMessage

Примерно так:

InputStream stream = new FileInputStream("/my.eml");
MimeMessage message = new MimeMessage(Session.getDefaultInstance(System.getProperties()),stream);

Чтение этого EML занимает слишком много времени, если его размер превышает 10 МБ. (около 10-25 секунд)

Код работает нормально, поэтому не беспокойтесь о коде. Я ищу что-то, что может увеличить скорость разбора.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Оберните ваш FileInputStream внутри BufferedInputStream. Таким образом, вы избегаете проходить через стек хранения вашей операционной системы для каждого отдельного байта, а вместо этого читаете их несколько за один проход в память.

Или для цели измерения производительности синтаксического анализа отдельно от чтения байт из файла, попробуйте загрузить его заранее в память:

    public static void main( String[] args ) throws Exception {
      File file = new File("C:\\Users\\Public\\Documents\\bigemail.eml");
      byte[] data = new byte[Math.toIntExact(file.length())];
      FileInputStream fis = new FileInputStream(file);
      int bytesRead = fis.read(data);
      System.out.println("Read " + bytesRead + " bytes");
      fis.close();

      for(int i=0; i<5; i++) {
        parseMail(new ByteArrayInputStream(data));
      }
    }

    private static void parseMail(InputStream memoryStream) throws Exception {
      var start = System.nanoTime();
      MimeMessage message = new MimeMessage(Session.getDefaultInstance(System.getProperties()),memoryStream);
      var stop = System.nanoTime();
      System.out.printf("Parsing? took %f s\n", (stop-start)/1_000_000_000.0);
      System.out.println("Subject: " + message.getSubject());
    }

На моем ноутбуке вывод показывает:

Считать 12610414 байт
Парсинг? Взял 0,261948 с
Тема: FW: .........
Парсинг? Взял 0,024068 с
Тема: FW: .........
Разбор? Взял 0,020336 с
Тема: FW: .........
Разбор? Взял 0,010707 с
Тема: FW: .........
Парсинг? Прошло 0,010973 с
Тема: FW: .........

Так что первый раз кажется немного медленнее, но для 12 МБ все еще далеко от того, что вы сообщают.

Это использует Oracle Java 10 в системе с 16 ГБ памяти и использует эту зависимость maven:

<dependency>
  <groupId>com.sun.mail</groupId>
  <artifactId>javax.mail</artifactId>
  <version>1.6.2</version>
</dependency>
0 голосов
/ 17 апреля 2020

Попробуйте использовать SharedFileInputStream .

...