Параллельная работа с одним файлом

Есть один, очень большой файл с данными. Этот файл открывается в одной вкладке jupyter notebook и по коду запроса к api, идет дополнение исходных данных данными полученными от api. Например, есть в исходном файле есть колонка с id пользователя, а от api1, на основании этого id получаю его статус (колонка status) и дату (status_date). Есть другой api2, который на основании id пользователя и полученного status от api1 дополняет исходные данные полом пользователя (gender) и датой рождения (birthday). В идеале, на выходе, после двух api нужно получить один файл, в котором будут колонки с обоих api (id пользователя, status, status_date, gender, birthday). Но проблема в том, что на обоих api есть ограничение на кол-во подключений, поэтому, выходов несколько:

  1. через прокси обращаться к api (так и не смог заставить работать, отмел эту идею)
  2. получить все нужные данные от api1, а потом все данные передать к api2. Но тут то же проблема - получение ответов от api1 так же как и от api2 займет (суммарно) 2 месяца.
  3. открыть один и тот же файл с id пользователями в двух вкладках jupyter notebook для того, чтобы данные с двух api параллельно записывались в один файл.

Вопрос в следующем: как сделать так, чтобы данные с двух потоков писались параллельно в один файл и не конфликтовали друг с другом?

Процесс представляю себе так: запустил скрипт по обращению к api1. Он прогрузил несколько тысяч строк. Я останавливаю процесс запросов к api1, сохраняю файл, открываю его в другой вкладке и на основании полученных от api данных, обращаюсь к api2. Параллельно с эти запускаю обращение к api1 с той же строки где и закончил, api2 в этот момент отдает ответы на запросы. Когда полученные от api1 несколько тысяч строк в api2 заканчиваются, то полученные от api2 строки ДОЗАПИСЫВАЮТСЯ и исходный файл. И процесс заново повторяется до тех пор, пока данные от api1 и 2 не будут получены. В итоге, суммарное время работы с двумя api у меня должно быть не 2 месяца, а чуть больше месяца и на выходе, я сразу получаю один файл, в котором хранятся данные полученные от двух api.


Ответы (1 шт):

Автор решения: CrazyElf

Я тут вижу два варианта:

  • Загнать данные из файла в базу данных и работать с БД, получая оттуда и обновляя там записи. Собственно, БД и придуманы для того, чтобы вы могли к ним многопоточно обращаться, запрашивая и меняя там данные
  • Создать два новых файла из этого файла, в одном будет id и колонки, заполняемые первым api, во втором id и колонки, заполняемые вторым api. Эти файлы пусть заполняются независимо друг от друга. В конце данные из них можно будет через pandas.join соединить с основным файлом. А можно это делать и в процессе работы периодически, если кому-то нужны будут соединённые данные до окончания всех процессов.

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

→ Ссылка