Чтение большого файла (более 60 ГБ) и запись нового файла

Есть один файл размером 60 ГБ и 200 000 000 строк. Полезная нагрузка файла показана ниже.

источник.txt

0.0 4.6 6.3 3.8 5.0 0.0 -3.8 -5.9 1.5 14.2 0.0 1.0 6.9 5.8 6.1 0.0 5.4 -7.1 0.9 6.8 0.0 -1.8 2.6 0.0 -11.5 -0.0 
0.0 13.4 -1.8 5.2 2.4 0.0 -7.1 -12.5 -2.8 11.8 0.0 2.0 5.5 3.5 8.2 0.0 9.2 -18.2 -3.4 1.7 0.0 -16.1 3.2 0.0 9.7 -0.1 
0.0 12.2 -2.0 7.2 0.1 0.0 -9.1 -11.8 -2.5 8.8 0.0 1.1 4.6 3.8 8.0 0.0 8.3 -18.5 -5.0 0.6 0.0 -14.3 2.8 0.0 10.6 -0.0 
0.0 10.6 -0.6 8.3 -2.2 0.0 -9.4 -8.4 -1.5 5.3 0.0 1.9 3.5 3.6 7.1 0.0 7.6 -16.5 -5.7 0.6 0.0 -9.5 1.9 0.0 7.8 0.0 

Я хочу прочитать файлы по порядку и создать новый файл, включая порядковый номер. Полезная нагрузка создаваемого файла выглядит следующим образом.

пункт назначения.txt

 1: 0.0 4.6 6.3 3.8 5.0 0.0 -3.8 -5.9 1.5 14.2 0.0 1.0 6.9 5.8 6.1 0.0 5.4 -7.1 0.9 6.8 0.0 -1.8 2.6 0.0 -11.5 -0.0 
 2: 0.0 13.4 -1.8 5.2 2.4 0.0 -7.1 -12.5 -2.8 11.8 0.0 2.0 5.5 3.5 8.2 0.0 9.2 -18.2 -3.4 1.7 0.0 -16.1 3.2 0.0 9.7 -0.1 
 3: 0.0 12.2 -2.0 7.2 0.1 0.0 -9.1 -11.8 -2.5 8.8 0.0 1.1 4.6 3.8 8.0 0.0 8.3 -18.5 -5.0 0.6 0.0 -14.3 2.8 0.0 10.6 -0.0 
 4: 0.0 10.6 -0.6 8.3 -2.2 0.0 -9.4 -8.4 -1.5 5.3 0.0 1.9 3.5 3.6 7.1 0.0 7.6 -16.5 -5.7 0.6 0.0 -9.5 1.9 0.0 7.8 0.0 

Я могу использовать Java, чтобы сделать следующее

    String filePath = "/filepath";

    Path path = Paths.get(filePath+"/source.txt");

    BufferedReader bufferedReader = Files.newBufferedReader(path);

    Stream<String> lines = bufferedReader.lines();
    AtomicLong seq = new AtomicLong(0);

    BufferedWriter bufferedWriter = Files.newBufferedWriter(Paths.get(filePath+"/dest.txt"));

    lines.forEach(txt -> {
        try {
            bufferedWriter.append(seq.addAndGet(1) + ":" + txt);
            bufferedWriter.newLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
    });

но мне интересно, возможно ли использовать распределенную универсальную структуру, такую ​​​​как Spark, Storm или Hadoop. Я думаю, что платформы больших данных делают это быстрее


person m2sj    schedule 02.10.2019    source источник
comment
Вам нужно будет перебирать каждую строку по порядку и отслеживать этот счетчик. Невозможно распределить последовательный подсчет, не зная, на сколько строк вы разбиваете файл. Даже в этом случае вам не нужна среда больших данных, поскольку вы можете использовать многопоточность.   -  person OneCricketeer    schedule 02.10.2019
comment
cricket_007 ценю ваш ответ   -  person m2sj    schedule 02.10.2019
comment
Это просто комментарий... К тому же, если бы вы сохранили этот файл в HDFS, он был бы разделен на несколько файлов меньшего размера за кулисами, так что, опять же, вам нужно было бы знать, с какого исходного номера строки начинается каждая часть.   -  person OneCricketeer    schedule 02.10.2019


Ответы (1)


В Spark есть кое-что, что может быть полезно.

  1. Создайте RDD из файла CSV
  2. Используйте комбинацию zipWithIndex, sortBy, map

Проверьте https://stackoverflow.com/a/26081548/290036 для примера zipWithIndex.

person Horatiu Jeflea    schedule 02.10.2019
comment
Почему сортировать по? А что картируется? Не могли бы вы поделиться примером? - person OneCricketeer; 03.10.2019