В целом:
Примером простого способа размещения XML-данных и получения ответа (как строки) была бы следующая функция:
public string postXMLData(string destinationUrl, string requestXml)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(destinationUrl);
byte[] bytes;
bytes = System.Text.Encoding.ASCII.GetBytes(requestXml);
request.ContentType = "text/xml; encoding='utf-8'";
request.ContentLength = bytes.Length;
request.Method = "POST";
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
HttpWebResponse response;
response = (HttpWebResponse)request.GetResponse();
if (response.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = response.GetResponseStream();
string responseStr = new StreamReader(responseStream).ReadToEnd();
return responseStr;
}
return null;
}
В вашем конкретная ситуация:
Вместо:
request.ContentType = "application/x-www-form-urlencoded";
use:
request.ContentType = "text/xml; encoding='utf-8'";
Также удалите:
string postData = "XMLData=" + Sendingxml;
И замените:
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
на:
byte[] byteArray = Encoding.UTF8.GetBytes(Sendingxml.ToString());
Подумайте, действительно ли вам нужны все эти данные в явном виде или может быть разрешена матрица? В R есть хорошая поддержка (см. Пакет Matrix
для, например,) для разреженных матриц.
Сохраняйте все остальные процессы и объекты в R до минимума, когда вам нужно создавать объекты такого размера. Используйте gc()
, чтобы очистить неиспользуемую память, или, лучше создать только тот объект, который вам нужен за один сеанс .
Если приведенное выше не поможет, получите 64-разрядную машину с таким количеством оперативной памяти, какую вы можете себе позволить, и установите 64-разрядную R.
Если вы не можете этого сделать, онлайн-сервисы для удаленных вычислений.
Если вы не можете сделать это, инструменты для сопоставления памяти, такие как пакет ff
(или bigmemory
, как упоминается Sascha), помогут вам построить новое решение. В моем ограниченном опыте ff
- это более сложный пакет, но вы должны прочитать тему High Performance Computing
в представлении задач CRAN.
Если вы запускаете свой скрипт в среде linux, вы можете использовать эту команду:
bsub -q server_name -R "rusage[mem=requested_memory]" "Rscript script_name.R"
, и сервер будет выделять запрошенную вам память (в соответствии с лимитами сервера, но с хорошим сервером - можно использовать огромные файлы)
server_name
? Я сталкиваюсь с этим cannot allocate vector size...
, пытаясь сделать огромную матрицу Document Term в AMI, и я не могу понять, почему у нее недостаточно памяти или сколько еще мне нужно арендовать. Спасибо!
– seth127
15 March 2016 в 03:06
Самый простой способ обойти это ограничение - переключиться на 64 бит R.
Error: cannot allocate vector of size ... Gb
(но да, у меня много данных).
– om-nom-nom
11 April 2012 в 18:20
Я столкнулся с подобной проблемой, и я использовал 2 флеш-накопителя как «ReadyBoost». Эти два диска обеспечили дополнительную память объемом 8 ГБ (для кеша), и она решила проблему, а также увеличила скорость всей системы в целом. Чтобы использовать Readyboost, щелкните правой кнопкой мыши на диске, перейдите к свойствам и выберите «ReadyBoost» и выберите переключатель «использовать это устройство» и нажмите «Применить» или «ОК» для настройки.
Вот презентация на эту тему, которая может показаться интересной:
http://www.bytemining.com/2010/08/taking-r-to-the-limit- part-ii-large-datasets-in-r /
Я сам не пробовал обсуждаемые вещи, но пакет bigmemory
кажется очень полезным
Метод сохранения / загрузки, упомянутый выше, работает для меня. Я не уверен, как / if gc()
дефрагментирует память, но это, похоже, работает.
# defrag memory
save.image(file="temp.RData")
rm(list=ls())
load(file="temp.RData")
Для пользователей Windows следующее помогло мне понять некоторые ограничения памяти:
gc()
для сбора мусора => она работает, я вижу, что использование памяти сокращается до 2 ГБ [/g1]
Дополнительные советы, которые работают на моей машине:
gc()
- просто иллюзия. Проверка диспетчера задач - это просто базовые операции с окнами. Единственный совет, с которым я могу согласиться, заключается в сохранении формата .RData
– David Arenburg
15 July 2014 в 11:23
gc()
не работает. Я просто хочу сказать, что R делает это автоматически, поэтому вам не нужно делать это вручную. См. здесь
– David Arenburg
15 July 2014 в 13:09
gc()
Работает . Вам просто не нужно использовать его, потому что R делает это внутренне
– David Arenburg
15 July 2014 в 13:22