обрабатывать файл данных объемом 1 ГБ для чтения слов и вычисления слова максимальной длины?

#java #spring #file #large-files #r.java-file

Вопрос:

я написал этот код, но он потерпит неудачу в файле размером 1 ГБ.

 public class TestFiles {

    public static void main(String[] args) {
        int minLength = Integer.MAX_VALUE;
        int maxLength = Integer.MIN_VALUE;
        String minWord = "";
        String maxWord = "";
        List<String> words = new ArrayList<>();
        try {
            File myObj = new File("C:\Users\Downloads\java.txt");
            Scanner myReader = new Scanner(myObj);
            while (myReader.hasNextLine()) {
                String data = myReader.nextLine();
                String[] dataArray = data.split(" ");
                List<String> list = Arrays.asList(dataArray);
                for (String s : list) {
                    if (s.length() < minLength) {
                        minLength = s.length();
                        minWord = s;
                    } else if (s.length() > maxLength) {
                        maxLength = s.length();
                        maxWord = s;
                    }
                }
            }
            myReader.close();
        } catch (Exception e) {
            // TODO: handle exception
        }
        System.out.println("min length "   minLength   " - max lenth "   maxLength);
        System.out.println("min length word "   minWord   " - max lenth word "   maxLength);
    }
}
 

не могли бы вы ответить, пожалуйста? как я могу это решить?

Комментарии:

1. Вы, кажется, не держите слов, поэтому я бы предложил потоковое воспроизведение строк. Взгляните на Files.lines(Path) это . Оттуда вы можете использовать flatMap() для сопоставления потока строк с потоком слов, а затем max() с помощью соответствующего компаратора.

2. «он потерпит неудачу»: как он терпит неудачу? Исключение? Пожалуйста, опишите!

3. вероятно, проблема с памятью

4. вероятно/очевидно: 1 ГБ данных, но ни одного(/слишком мало) разрыва строк!!

5. не делайте это «по строчкам», делайте это «по словам»!!!;) (не nextLine() ..только next() !)

Ответ №1:

Проблема становится очевидной, когда 1 гб слов сжимается в 1 строку!*

Решение: Не обрабатывать ввод «по строкам», а «по словам», что достаточно эффективно! 😉

Вуаля:

 public class TestFiles {

  public static void main(String[] args) {
    int minLength = Integer.MAX_VALUE;
    int maxLength = Integer.MIN_VALUE;
    String minWord = "";
    String maxWord = "";
    try {
        File myObj = new File("C:\Users\Downloads\java.txt");
        Scanner myReader = new Scanner(myObj);
        while (myReader.hasNext()) {
            String word = myReader.next();
            if (word.length() < minLength) {
              minLength = word.length();
              minWord = word;
            } 
            if (word.length() > maxLength) {
              maxLength = word.length();
              maxWord = word;
            }
          }
        }
        myReader.close();
    } catch (Exception e) {
        // TODO: handle exception
    }
    System.out.println("min length "   minLength   " - max lenth "   maxLength);
    System.out.println("min length word "   minWord   " - max lenth word "   maxLength);
  }
}
 

*когда «много» слов в одной строке, тогда у нас могут возникнуть проблемы здесь:

  • myReader.hasNextLine() ,
  • String data = myReader.nextLine() и
  • String[] dataArray = data.split(" ");

ответ @huy также правильный: else он «эффективен в большинстве случаев», но «неверен для угловых случаев».

Комментарии:

1. Вы правы, я имел в виду поток ввода файлов docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html

Ответ №2:

 int len = s.length();
if (len < minLength) {
    minLength = len;
    minWord = s;
} 
if (len > maxLength) {
    maxLength = len;
    maxWord = s;
}
 

Ваш тестовый случай завершится неудачей, если большая строка расположена в первом индексе первой строки.

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

Комментарии:

1. Возможно, вы захотите, чтобы ваш ответ было немного легче прочитать, т. Е. Я почти пропустил часть «удалить остальное «.

2. Работает ли это, я ненавижу редактор stackoverflow, им трудно пользоваться. ^^

3. Кстати, я бы добавил еще несколько объяснений, почему else их следует удалить, например, на каком-нибудь примере, чтобы помочь тем, кто может бороться с концепцией.

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