• [linux] как выделить больше памяти/ресурcов для приложения?

    @res2001
    Developer, ex-admin
    Распараллеливать смысла нет - дисковые операции плохо паралляться, т.к. диск - медленное устройство. Основной тормоз в вашем случае именно он. Читайте не построчно, а большими блоками, кратными размеру кластера, например по 4/8/16Кб, этим сократите количество дисковых операций. Код конечно усложниться. В прошлом вопросе вам Oleg Shevelev это уже писал.
    Для распараллеливания можно использовать асинхронный IO, но, имхо, это еще больше усложнит код, скорее всего для вашей задачи это не нужно (должно помочь чтение большими порциями), т.к. дальнейшие операции с прочитанной строкой тривиальны.
    И кстати, можно не делать чтение файла на С++, если хорошо знаете Матлаб делайте на нем по тому же алгоритму - т.к. дисковые операции основной тормоз, то преимущества от использования С++ практически не будет.

    А вообще система отдает программе столько ресурсов сколько ей требуется, если ресурсов не хватает - обычно программа завершается с ошибкой.
    Ответ написан
    6 комментариев
  • [Большой txt ~1 гб] как обработать?

    @kazmiruk
    Прогоните файл утилитой sort (если используете linux). На выходе получите файл, который будет отсортирован. А дальше дело техники, файл в память грузить не надо. Читаете построчно и суммируете z. Как только поменялись x или y - обнуляем z и считаем для следующей пары.
    Ответ написан
    3 комментария
  • [Большой txt ~1 гб] как обработать?

    @Tuvan
    Если X и Y не слишком большие ,то можно сделать матрицу SUM[X][Y] += Z (аналог матрицы смежности в графах)
    Ответ написан
    2 комментария
  • [Большой txt ~1 гб] как обработать?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    1) удалить в txt последние 2 столбца (ибо не используются)
    - если есть возможность не обрабатывать данные которые не нужны то так и нужно поступить.
    2) загнать txt в sql -> обработать там.
    - бессмысленное занятие
    3) возможно есть что-то для больших файлов у c++.
    - суть разбора больших файлов (1, 10, 100, 1000 гигабайт на файл и больше) в том что бы читать его чанками по несколько байт (размер выбирается исходя из задачи) и анализ файла в поточном виде (не загружать его весь в память).

    Алгоритм:
    1. читаете поточно по N байт
    2. при нахождении \n считаете что началась новая строка
    3. как только собрали строку - делаете с ней что хотите, в данном случае разбиваете по-пробельно (explode(" ", $str); пример из php, но не суть)
    4. закидываете в некий результирующий массив третью ячейку в качестве значения и первые две ячейки в качестве ключа, если данные уже были то суммируете.

    Конечно это не спасёт от величины результирующего массива равного количеству уникальных ключей (ячейки x y). Для этого применяют mapReduce, но для вашей задачи он избыточен.

    Вариант как избавиться от большого результирующего массива:
    1. алгоритм прежний
    2. записываете значение в mysql или любую другую базу в виде
    INSERT INTO result_table
    SET
        key = ".$key.",
        value = ".$value."
    ON DUPLICATE KEY UPDATE value = value + ".$value."

    Где result_table.key PRIMARY KEY
    Ответ написан
    7 комментариев
  • [Большой txt ~1 гб] как обработать?

    AtomKrieg
    @AtomKrieg
    Давай я поищу в Google за тебя
    Если вам нужно делать это постоянно и скорость важна как воздух, то выбирайте С++. Вариант на c++ примерно такой:
    1) Считать весь файл в память.
    2) Распарсить каждую строчку (вручную, так как у встроенных функций есть оверхед)
    3) Для подсчета суммы используем контейнер
    map<pair<int, int>, int> result;
    get_parse(val1, val2, val3);
    result[std::make_pair(val1, val2)] += val3;

    4) Пишем весь контейнер в память (ручной функцией), сохраняем на диск.

    SQL будет точно самым медленным решением. Если хотите воспользоваться питоном, то используйте библиотеку Pandas (stackoverflow.com/questions/15570099/pandas-pivot-... или Numpy (но тогда без текстов, сами пример ищите)
    Ответ написан
    6 комментариев
  • [Большой txt ~1 гб] как обработать?

    @abcdefghijklmnopq
    функция API операционной системы для маппинга файлов на оперативную память как раз для этих целей подходит.

    если есть возможность я бы все равно предварительно подрезал бы (два последних ненужных столбца), например, EmEditor хорошо работает с большими файлами.
    Ответ написан
    1 комментарий