X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> Как убрать дубли по ключу в большом файле?
prolisk
prolisk
Topic Starter сообщение 20.10.2019, 16:50; Ответить: prolisk
Сообщение #1


Есть файл json на 8+ миллионов строк, размером 700 мбайт.
Нужно убрать дубли по определенному ключу (не по строкам).
{'title':'7778', 'mes':'ruseo', 'coord': '755'}
{'mes': 'seoru', 'title' : '7778', 'coord' : '-'}
...

Оставить только уникальные значения по title.

Дубли по строкам убрал с помощью sort. Теперь надо по тайтлу.
json.load, set не хватает памяти - memory error в питоне (ОЗУ на пк 64 гбайт).
Сейчас через питон открываю как обычный файл, иду построчно. Если значение уникальное, то строку в массив.
Только за 2 суток обработало менее 1,5 млн строк.

Как обработать эти строки максимально быстро? Любым способом.
Спасибо :)


--------------------
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
k0ttee
k0ttee
сообщение 21.10.2019, 3:24; Ответить: k0ttee
Сообщение #2


А прождать (8/1,5)*2=10,6666666667 дней нельзя?

Разделить файл на части и перемалывать их (сколько частей - столько потоков). Затем придётся сравнить части между собой.
Если в частях будет убрано много дублей, последнее сравнение "всех со всеми" пройдёт быстрее.
Распараллелить можно на несколько частей в компе, ноуте, сервере...

[off]Однажды я парсил сайт на миллион страниц: там было от 000 000 до 999 999. Начал с домашнего компа (молотил от 000 000 вперёд), затем добавил в работу VDS (молотил от 999 999 назад), потом запустил ещё потоки от середины. Процессы шли несколько суток.[/off]


--------------------
Задонь кибер-коту на крипто-вискас
btc: 3Hq7X9CosVftRFPqWis1Dkk5MdtM1u6jj9
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
prolisk
prolisk
Topic Starter сообщение 21.10.2019, 13:47; Ответить: prolisk
Сообщение #3


(k0ttee)
Затем придётся сравнить части между собой.

думал об этом, но сильно ли быстрее будет?
(k0ttee)
А прождать (8/1,5)*2=10,6666666667 дней нельзя?

будет больше дней, т.к. массив увеличивается с каждый уникальным значением, и каждый раз сравнивается с большим количеством элементов. Поэтому срок будет больше.
Первый 1,5 млн за 2 суток, последний 1,5 млн больше будет (+пару млн для сравнения).

Добавлено спустя 1 час 32 минуты 1 секунду:
Огромное спасибо ребятам из toster, немало решений дали.
Одно из рабочих (вроде все как надо, по времени до 1 минуты):
from functools import lru_cache
import re


def main():
    @lru_cache(maxsize=None)
    def process(title): fo.write(line)
    #regex = re.compile('"title": "(\d+)"')
    #regex = re.compile('"title": "([a-zA-Z0-9а-я А-Я]+)(\d*)"')
    regex = re.compile('"title": "(.*?)"')
    with open(r'C:\Users\User\Downloads//json3.json', 'r', encoding='utf-8') as fi, open(r'd:/output.json', 'a', encoding='utf-8') as fo:
        for line in fi:
            matchobj = regex.search(line)
            if matchobj:
                process(matchobj.group(1))
main()


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
prolisk
prolisk
Topic Starter сообщение 28.10.2019, 14:23; Ответить: prolisk
Сообщение #4


Апну немного тему.
Когда сделал задачу, я оставил "работать" свой скрипт, чтобы посмотреть за сколько же он отработает. В общем, за 5 суток прошло чуть более 2млн строк. Я его закрыл (отменил).
А тот скрипт все 8+млн отработал за пару минут :)

Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.


--------------------
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Большие ставки для кликов в Я.Директ. Как удешевить?
2 rownong27 1122 26.3.2024, 14:13
автор: knezevolk
Открытая тема (нет новых ответов) Как вы бросили работу и перешли на заработок с сайтов?
12 uahomka 2293 25.3.2024, 6:52
автор: Skyworker
Открытая тема (нет новых ответов) Как отозвать банковский платеж фрилансеру?
28 metvekot 3920 25.3.2024, 6:34
автор: Skyworker
Открытая тема (нет новых ответов) Как вывести деньги в Украине с заблокированного Юмани ?
23 freeax 3644 24.3.2024, 20:55
автор: Liudmila
Открытая тема (нет новых ответов) Через какой браузер и как можно найти в кэшэ браузера видео
10 Room 1939 23.3.2024, 7:41
автор: Room


 



RSS Текстовая версия Сейчас: 29.3.2024, 9:42
Дизайн