2015-01-23 3 views
-2

Корневая папка D:/data/. Внутри этой корневой папки есть много подпапок. Файлы CSV хранятся внутри подпапок, например.Как ускорить чтение файла CSV в R

D:/data/ 
    f1 
     1.csv 
     2.csv 
    f2 
     1.csv 
     2.csv 

Я использую следующий код для чтения своих CSV-файлов. Однако для чтения около 20 000 CSV-файлов требуется несколько часов.

allFolders = list.files("D:/data/") 
for(folder in 1:length(allFolders)) 
{ 
    dirPath = paste0("D:/data/", allFolders[folder], '/') 
    for(i in 1:100) 
    { 
    f = fread(paste0(dirPath, i, ".csv")) 
    # data processing 
    } 
} 

Любая идея, как я могу ускорить этот процесс в Windows? Я попытался использовать пакет foreach, однако производительность была почти такой же, вероятно, из-за ограничения скорости устройства ввода-вывода.

Update:

Это, как я реализую foreach:

allFolders = list.files("D:/data/") 
for(folder in 1:length(allFolders)) 
{ 
    allf <- vector(mode = "list", length = 100) 
    allf <- foreach(i=1:100, .combine=rbind) 
    { 
    f = data.table::fread(paste0(dirPath, i, ".csv")) 
    f 
    } 
} 
+1

'fread' обычно является демоном скорости, и я подозреваю, что это не то место, где есть узкое место. Можете ли вы преобразовать CSV-файлы в базы данных SQLite (или разместить их как таблицы в одной базе данных SQLite)? Можете ли вы опубликовать установочный код для попыток 'foreach', который вы сделали? Это может быть что-то в том, как вы выполняете конфигурацию параллельной обработки. – hrbrmstr

+1

@hrbrmstr Я сомневаюсь, что SQLite обеспечит улучшение. –

+1

Вы должны заметить, что 'fread' находится в пакете' data.table'. Если это действительно так, то «fread». Его нет в базе R. – Spacedman

ответ

1

lapply или sapply вместо цикл может помочь.

Для дальнейшего добавления: Возможно, выясните способ очистки данных. Похоже, что неэффективно иметь данные в 20 000 различных CSV-файлах. Когда я работаю с большими наборами данных (либо в количестве файлов или размера), я стараюсь, чтобы очистить в ряде шагов, и сохранить только нужные данные в файлах .rds для легкого чтения в R.

allFolders = list.files("D:/data/") 

folders_as_list <- lapply(1:length(allFolders), function(i){ 
        dirPath <- file.path("D:/data/", allFolders[i]) 
         res <- lapply(1:100, function(j){ 
           f <- fread(paste0(dirPath, j, ".csv")) 
           [DATA PROCESSING] 
           return(f_processed) 
          }) %>% rbind_all 
        return(res) 
        }) 

Который должен вернуть список 1: length (allFolders), где каждый элемент в списке будет data.frame, где все отдельные CSV-файлы из одной папки были объединены вместе.

+0

Можете ли вы опубликовать пример lapply для моего дела? –

+0

К сожалению, я не могу удалить файлы. Все они важны. Первоначально данные были представлены таким образом. Кстати, мой вопрос состоял в том, можно ли использовать «list.files» для получения всех файлов из подпапок? –

+1

Я понимаю, что вы не можете удалять файлы, но если вы постоянно работаете с файлами, может возникнуть проблема загрузить их в R, очистить их и объединить в большие 'data.frames', а затем сохранить их как .rds-файлы , Что касается 'list.files', он принимает аргумент, называемый' include.dirs', который является следующим: "logical. Если имена подкаталогов включены в рекурсивные списки? (Они всегда в нерекурсивных). А также как «рекурсивный» «логический. Если листинг переписывается в каталоги?» – kristang

Смежные вопросы