मैं एक निर्देशिका से कई फाइलें (20000 से अधिक) पढ़ने की कोशिश कर रहा हूं और अपने डेटा को एक डेटाफ्रेम में संग्रहीत कर रहा हूं। उनका प्रारूप इस प्रकार है, वे सभी पहले कॉलम को साझा करते हैं (ध्यान दें कि पहले कॉलम में संख्याएं फ़ाइल नामों से मेल खाती हैं, उस पर और बाद में):

test = read.delim("814630", head = F)
head(test)
      V1   V2
1 814630 0.00
2 839260 1.95
3 841877 2.59
4 825359 4.95
5 834026 5.16
6 825107 6.21

फिर मैं फाइलों को पढ़ने के लिए ऐसा करता हूं (उदाहरण में मैंने सिर्फ 5 फाइलें पढ़ी हैं):

> temp = list.files()
> length(temp)
[1] 20819
> start_time <- Sys.time()
> data = lapply(temp[1:5], read.delim, head=F)
> end_time <- Sys.time()
> end_time - start_time
Time difference of 0.1406569 secs

यदि मैं parallel पैकेज से mclapply का उपयोग करता हूं तो मुझे एक समान समय मिलता है (जब मैं 20000 फाइलों के लिए ऐसा करता हूं, तो इसमें 15-20 मिनट लगते हैं, इस समय को बेहतर बनाने के बारे में कोई सलाह भी मदद करेगी):

> library(parallel)
> numCores <- detectCores()
> cl <- makeCluster(numCores)
> data = mclapply(temp[1:5], read.delim, head=F)
Time difference of 0.1495719 secs

फिर मैं left_join से dplyr पैकेज को एक डेटा फ्रेम में मर्ज करने के लिए उपयोग करता हूं।इस दूसरे भाग में कुछ फाइलों के डेटा के साथ थोड़ा समय लगता है, लेकिन जब मैं सभी को मर्ज करने का प्रयास करता हूं डेटा फ़ाइलों को पढ़ने से भी अधिक समय लेता है (इसमें कई घंटे लग सकते हैं)।

> test = data %>% reduce(left_join,by="V1")
Time difference of 0.05186105 secs

मुझे लगता है कि इसे और अधिक कुशल बनाने का कोई तरीका है, लेकिन मुझे आर में दोहराए जाने वाले कार्यों को अनुकूलित करने का अधिक अनुभव नहीं है, किसी भी मदद की बहुत सराहना की जाएगी।

साथ ही, यहां बताया गया है कि कुछ स्वरूपण के बाद मेरा अंतिम डेटा.फ्रेम कैसा दिखेगा। ध्यान दें कि डेटा एक सममित मैट्रिक्स है। तो हो सकता है कि केवल आधे डेटा को पढ़ने का एक तरीका हो जो प्रक्रिया को गति दे सके।

> row.names(test) = test[,1]
> test[,1] = NULL
> colnames(test) = temp[1:5]
> test = test[order(as.numeric(row.names(test))), order(as.numeric(names(test)))]
> 
> head(test)
         814630   814636   814637  814638   814639
814630     0.00   318.41 13293.00 2012.21   391.97
814636   318.41     0.00  1345.84 1377.79  1889.77
814637 13293.00  1345.84     0.00 6477.10 10638.69
814638  2012.21  1377.79  6477.10    0.00  3905.41
814639   391.97  1889.77 10638.69 3905.41     0.00
0
eggrandio 26 मार्च 2020, 20:57

1 उत्तर

सबसे बढ़िया उत्तर

एक सरल दृष्टिकोण जो मानता है कि प्रत्येक तालिका में सभी V1 मौजूद हैं:

library(dplyr)
V1 <- read.delim(temp[1], head=F) %>% arrange(V1) %>% dplyr::select(-V2)
data = lapply(temp[1:5], function(x) {
    read.delim(x, head=F) %>% arrange(V1) %>% dplyr::select(-V1)
})
test <- cbind(V1, do.call(cbind, data))

यह बार-बार left_join की तुलना में बहुत तेज़ होगा क्योंकि जुड़ने से आपके पास अधिक कॉलम/पंक्तियाँ धीमी हो जाती हैं।

1
thc 26 मार्च 2020, 18:16