2013-08-28 5 views
5

मैं वेब डेटा स्क्रैप कर रहा हूं और कुछ परिणाम 8K से अधिक टेक्स्ट हैं। मेरे पास एमएस एसक्यूएल सर्वर 2008 आर 2 में एक क्षेत्र है जो वर्चर (अधिकतम) है लेकिन आरओडीबीसी केवल 8 के बचाता है और शेष को छोटा करता है। मेरे पास एसएस आर 2 और ओडीबीसी 11 से एसक्यूएल मूल क्लाइंट 10 दोनों का उपयोग करके डीएसएन कनेक्शन स्थापित किए गए हैं।आरओडीबीसी डेटा फ्रेम से 8k वर्कर/टेक्स्ट से अधिक नहीं बचाता

वर्ग शीर्षक के लिए sqlType रिटर्न -1, वर्चर (अधिकतम)/टेक्स्ट इंगित करता है।

दोनों कनेक्शन 8K पर टेक्स्ट को छोटा कर देते हैं। क्या इसके लिए कोई फिक्स/वर्कअराउंड है या क्या मैं SQL सर्वर में 8K तक सीमित हूं? मैं MySQL पर स्विच कर सकता हूं यदि आर mySQL ड्राइवर बड़ी मात्रा में टेक्स्ट पास करेगा। मैं विन 7 x64 पर आर 3.0.1 और आरओडीबीसी 1.3-6 का उपयोग कर रहा हूं।

समस्या को दोहराने के लिए यहां कुछ नमूना कोड दिया गया है।

CREATE TABLE 
[test](
[title] [varchar](max) NULL 
) ON [PRIMARY] 


library(RODBC) 
ch <- odbcConnect("text", uid = "X", pwd = "X") 
sqlTypeInfo(ch,"test") 

testtext = data.frame("salasjflsjsf") 
colnames(testtext) = "title" 

## This works 
sqlSave(ch,testtext,"test",append=TRUE, rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE) 


## text > 8K 
testtext = data.frame(paste(rep("salasjflsjsf",5000),collapse="")) 
colnames(testtext) = "title" 

## use ODBC default type for title 
sqlSave(ch,testtext,"test",append=TRUE, rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE) 

## this message from ODBC 
## Query: INSERT INTO "test" ("title") VALUES (?) 
## Binding: 'title' DataType 12, ColSize 8000 
## Parameters: 
## no: 1: title salasjfl 
## [*text removed*] 
## lsjsfsalasjflsjsfsalasjflsjsfsalasjflsjsfsalasjflsjsfsalasjflsjsfsalasjflsjsf/***/ 
## Warning message: 
## In odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
## character data 'salasjflsjsfsalasjflsjsfsalasjflsjsfsalasjfl 




## try with varType set to text 
sqlSave(ch,testtext,"test",append=TRUE, varType = "text",rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE) 

## try with varType set to varchar(MAX) 
sqlSave(ch,testtext,"test",append=TRUE, varType = "varchar(max)",rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE) 

close(ch) 

मैंने कॉलम प्रकार को टेक्स्ट में बदल दिया और डीएसएन कनेक्शन को रीफ्रेश किया। पाठ प्रकार उठाया जा रहा है, लेकिन अब वहाँ एक त्रुटि संदेश है:

chtest <-odbcConnect("test2", uid = "X", pwd = "X") 
    > sqlColumns(chtest,"test") 
     TABLE_CAT TABLE_SCHEM TABLE_NAME COLUMN_NAME DATA_TYPE TYPE_NAME COLUMN_SIZE BUFFER_LENGTH DECIMAL_DIGITS NUM_PREC_RADIX NULLABLE REMARKS 
    1 RSS   dbo  test  title  -1  text 2147483647 2147483647    NA    NA  1 <NA> 
     COLUMN_DEF SQL_DATA_TYPE SQL_DATETIME_SUB CHAR_OCTET_LENGTH ORDINAL_POSITION IS_NULLABLE SS_IS_SPARSE SS_IS_COLUMN_SET SS_IS_COMPUTED 
    1  <NA>   -1    NA  2147483647    1   YES   0    0    0 
     SS_IS_IDENTITY SS_UDT_CATALOG_NAME SS_UDT_SCHEMA_NAME SS_UDT_ASSEMBLY_TYPE_NAME SS_XML_SCHEMACOLLECTION_CATALOG_NAME 
    1    0    <NA>    <NA>      <NA>         <NA> 
     SS_XML_SCHEMACOLLECTION_SCHEMA_NAME SS_XML_SCHEMACOLLECTION_NAME SS_DATA_TYPE 
    1        <NA>       <NA>   35 
    > sqlSave(chtest,testtext,"test",append=TRUE, varType = "text",rownames=FALSE, colnames = FALSE, safer=FALSE, verbose = TRUE) 
    Query: INSERT INTO "test" ("title") VALUES (?) 
    Binding: 'title' DataType -1, ColSize 2147483647 
    Error in odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
     'Calloc' could not allocate memory (18446744071562067968 of 1 bytes) 
    In addition: Warning messages: 
    1: In odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
     Reached total allocation of 6013Mb: see help(memory.size) 
    2: In odbcUpdate(channel, query, mydata, coldata[m, ], test = test, : 
     Reached total allocation of 6013Mb: see help(memory.size) 

उत्तर

1

आप पाठ स्तंभ परिभाषित प्रकार varchar(max) का हो सकता है, तो यह है कि जिस तरह से संग्रहीत किया जाएगा, भले ही varType को निर्दिष्ट जब डेटा को बचाने के।

कॉलम के साथ तालिका बनाने का प्रयास करें, फिर sqlSave का उपयोग करें। इस तरह डेटा को पंक्ति संदर्भ से बाहर रखा जाएगा और आपको छंटनी समस्या नहीं होनी चाहिए।

+1

एर्ट, मैंने आपके सुझाव का परीक्षण किया लेकिन डेटा को सहेजने में त्रुटि हुई। नीचे दिए गए परिणाम देखें। – user2720047

0

मैं एक ऐसी ही समस्या थी और कर समाप्त हो गया है:

# Finding the longest character 
varTypes = c(col_in_question=sprintf("varchar(%s)", max(nchar(data$col_in_question)))) 

# Uploading data 
sqlSave(channel = dbhandle, 
     dat = data, 
     tablename = "data_name", 
     rownames = FALSE, 
     varTypes = varTypes) 

इस तरह से आप अपने डेटासेट में अधिकतम करने के लिए varchar सेट में, और आप न किसी भी बहुत देर तक वर्ण हो अगर (2 जीबी) यह काम करना चाहिए। यदि आप वर्कर (अधिकतम) पर जोर देते हैं, तो आप sqlQuery का उपयोग करके अपने डेटासेट के बाद इसे बदल सकते हैं।

संबंधित मुद्दे