LINUX.ORG.RU
ФорумTalks

Сколько нужно памяти, чтобы отправить 300MB файл по http?


0

0

Ответ на этот вопрос зависит от того, насколько тру энтерпрайз софт вы пишете. Наша Ъ энтерпрайз поделка на Java при постинге 100МБ файла начала вываливаться по out of memory. Был предложен фикс, суть которого была в том, чтобы увеличить макс объём памяти доступный JVM до 768MB. При постинге 300MB файла проблема проявилась вновь :) Прежний фикс не помог -- на ура выжиралось 3GB

При отсылании в начале файла добавляется XML заголовок и потом все полученное енкодится в base64 поскольку наш Ъ ентерпрайз http сервер не понимает binary upload. Для каждого этапа используется bytesArray.

PS убиться об стену не прадлагать

PSS переписать с использованием стримов также не предлагать -- я это всё и так знаю

PSSS к написанию данного жобокода не имею ни малейшего отношения -- работаю на другом участке Ъ ентерпрайз работ


а на похапэ хоть гигабайт ) похапэ - глобально и надежно.

З.Ы. а че за существо файлы по 300MB закачивает по http? ftp уже не Ъ ынтырпрайз и все такое ?)

phasma ★☆
()

может прегонять кусками в base64, тогда памяти сэкономится 700 метров, но непонятно, где хавается 3 гига? ну файл в памяти byte[] 700 метров, ну результат перекодирования 700*4/3, в сумме 1633. Кстати не жрет ли Byte больше byte? Никогда не задавался этим вопросом.

wfrr ★★☆
()
Ответ на: комментарий от phasma

> З.Ы. а че за существо файлы по 300MB закачивает по http? ftp уже не Ъ ынтырпрайз и все такое ?)

Скажи спасибо что по http, а не как всё остальное через soap

zim
() автор топика
Ответ на: комментарий от phasma

> ftp уже не Ъ ынтырпрайз и все такое

Угу, ftp и php - символы Ъ ынтырпрайз.

anonymous
()
Ответ на: комментарий от wfrr

2 wfrr

по хорошему, нужно заюзать стрим и читать/писать chunk'ами по 4KB

а 3 гига выжерается потому, что bytes там несколько раз копируется

zim
() автор топика
Ответ на: комментарий от wfrr

> может прегонять кусками в base64, тогда памяти сэкономится 700 метров, 
о непонятно, где хавается 3 гига? ну файл в памяти byte[] 700 метров, ну
результат перекодирования 700*4/3, в сумме 1633. Кстати не жрет ли Byte
больше byte? Никогда не задавался этим вопросом.

пффффф, учись, студент:

void
post(sio::socket &sock, std::string data)
{
    std::string d1 = base64::encode(data);
    std::ostringstream os;
    os << "HTTP1/1 200 OK\nContent-Length: " << d1.size()
       << "\n\n" << d1;
    std::string d2 = os.str();
    sock.write(d2.c_str(), d2.size());
}

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от zim

>по хорошему, нужно заюзать стрим

тыже сам просил не предлагать стримы, вот я и предложил "эмулировать" его

wfrr ★★☆
()
Ответ на: комментарий от wfrr

> C++, а человек мучает жабу и просил потоки не предлагать 8), но пример полезный.

уверен, если хорошо владеть java [или же совсем её не знать] то можно достигнуть и не таких высот :)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

> пффффф, учись, студент:

О, узнаю коллегу по цеху

Примерно так тот код и выглядит. Только передавать массив по значению, а не по ссылке у нас не догадались. Или это ограничение жабы?

zim
() автор топика
Ответ на: комментарий от wfrr

> C++, а человек мучает жабу и просил потоки не предлагать 8), но пример полезный.

браза, когда я говорил про стриимы я имел в ввиду не тот тихий ужос, который в качестве шутки (я надеюсь) написал klalafuda, а что-то вроде

http://www.tntnet.org/cxxtools/html/base64stream_8h.html

zim
() автор топика
Ответ на: комментарий от zim

> а 3 гига выжерается потому, что bytes там несколько раз копируется

почитайте что-то про ортогональность в программировании

anonymous
()
Ответ на: комментарий от zim

Он тебе показал как память теряется, дибил, безотносительно есыка:

1. post(sio::socket &sock, std::string data) Где-то в проге существует объект data размером 300М, а то и 600М, если символы в UTF-16

2. std::string d1 = base64::encode(data); Создаём ещё один объект, размером 400М, а то и 800М, если символы в UTF-16

Плюс где-то выше небось ещё висит незачищенный буфер в который это всё вычитывали из файла.

anonymous
()
Ответ на: комментарий от anonymous

Хамло анонимное, ты сначала научись читать и понимать чужие комментарии, а потом уже лезь со своими пояснениями, которые никому не интересны в силу их тривиальности.

zim
() автор топика
Ответ на: комментарий от zim

> Хамло анонимное, ты сначала научись читать и понимать чужие комментарии

Что тут не понять:

>О, узнаю коллегу по цеху >Примерно так тот код и выглядит. Только передавать массив по значению, а не по ссылке у нас не догадались. Или это ограничение жабы?

Чайнега сразу видно.

anonymous
()
Ответ на: комментарий от zim

> Попробуй ещё подумать, если умеешь, конечно.

Не коси под древнегреческого философа. Если ты написал не то, что ты хотел сказать - то ты ещё больший дебил, чем я подумал вначале :-)

anonymous
()
Ответ на: комментарий от anonymous

Ладно, я уже понял, что ты тугой до предела, потому объясняю популярно. Я написал, что приведённый C++ код аналогичен жабовскому за исключением того, что в плюсовом варианте изначальные буфер с файлом передаётся в функцию post по значению, что может привести к ещё одному дополнительному копированию 300 мегабайт. Ферштейн?

zim
() автор топика
Ответ на: комментарий от klalafuda

> Кстати не жрет ли Byte больше byte? Никогда не задавался этим вопросом.

Насколько я понял, после перекодирования получается строка, которая в Java изначально уникодная...

atrus ★★★★★
()

неужели в j2ee до сих пор(последний раз занимался этим монгольским порно 2 года назад) не появилось нормального решения "искаропки" для аплоада файлов по HTTP? не верю!

cobold ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.