R Обновление Столбца В Большом Фрейме Данных

#r #csv #optimization #chess

Вопрос:

У меня есть фрейм данных, который хранится в формате csv, состоящий из 63 столбцов и 1,3 миллиона строк. Каждая строка представляет собой шахматную игру, каждый столбец содержит подробную информацию об игре (например, кто играл в игре, каков был их рейтинг, время, когда она была сыграна и т.д.). У меня есть столбец под названием «Проанализировано», который показывает, анализировал ли кто-то позже игру, так что это переменная да/нет.

Мне нужно использовать API, предлагаемый chess.com чтобы проверить, анализируется ли игра. Это просто. Однако как мне систематически обновлять csv-файл, не тратя огромное количество времени на чтение и запись csv-файла, учитывая при этом тот факт, что это займет огромное количество времени, и мне нужно делать это поэтапно? Я считаю, что лучшая практика для chess.com API должен использовать Sys.sleep после каждого вызова API, чтобы снизить вероятность того, что вы случайно делаете одновременные запросы, которые API не очень хорошо обрабатывает. Так что я должен поспать четверть секунды. Если мы предположим, что сам вызов API не занимает много времени, то это означает, что эта программа должна будет работать в течение 90 часов только из-за времени сна. Моя цель-сделать так, чтобы я мог легко запускать эту программу по частям, чтобы мне не нужно было запускать ее в течение 90 часов подряд.

Приведенный ниже код отлично подходит для определения того, была ли проанализирована игра, но я не знаю, как разумно обновить исходный csv-файл. Я думаю, что лучше всего было бы переписать новый фрейм данных и заменять старые Games.csv каждые 1000 или, скажем, вызовов API. Смотрите прокомментированный код ниже.

Мой общий вопрос заключается в том, когда мне нужно обновить большой столбец в csv, каков разумный способ постепенного обновления этого столбца?

 library(bigchess)
library(rjson)
library(jsonlite)

df <- read.csv <- "Games.csv"

for(i in 1:nrow(df)){
  data <- read_json(df$urls[i])
  if(data$analysisLogExists == TRUE){
    df$Analyzed[i] <- 1
  }
  if(data$analysisLogExists==FALSE){
    df$Analyzed[i] = 0
  }
  Sys.sleep(.25)

##This won't work because the second time I run it then I'll just reread the original lines 
##if i try to account for this by subsetting only the the columns that haven't been updated,
##then this still doesn't work because then the write command below will not be writing the whole dataset to the csv
if(i%00){
    write.csv(df,"Games.csv",row.names = F)
  }

}
 

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

1. Одна из возможностей для вас-узнать о data.table том, что в значительной степени предназначено именно для этого: путем ссылочной модификации data.frame похожих объектов путем расширения data.frame функциональности. Это вы можете сделать макет Games.csv доступной версии где-нибудь, где я (или другие), вероятно, смогу вам еще чем-то помочь. Здесь тоже есть много отличных data.table тем.

2. В противном случае вы также можете переключиться на операции с резервной копией файлов с помощью RSQLite или duckdb . Но data.table это здорово, и saveRDS() и readRDS() быстро для двоичных дампов.