Я заменил использование Float
на BigDecimal
для большей точности. Также я использовал две карты, одну для хранения суммированного значения, а другую для подсчета:
public static void main(String[] args) {
HashMap<String, String> hmap = new HashMap<>();
HashMap<String, BigDecimal> h2map = new HashMap<>();
hmap.put("order1", "pending");
hmap.put("order2", "cancelled");
hmap.put("order3", "pending");
h2map.put("order1", new BigDecimal("19.95"));
h2map.put("order2", new BigDecimal("19.95"));
h2map.put("order3", new BigDecimal("39.9"));
//Map for holding sum
HashMap<String, BigDecimal> sum = new HashMap<>();
for(String key : h2map.keySet()){
if(hmap.get(key) != null){
String value = hmap.get(key);
if(sum.get(value) == null){
sum.put(value, h2map.get(key));
}else{
sum.put(value, (sum.get(value).add(h2map.get(key))));
}
}
}
//Map for holding count
HashMap<String, BigDecimal> countMap = new HashMap<>();
for(Iterator<Map.Entry<String, BigDecimal>> itr = sum.entrySet().iterator(); itr.hasNext(); ){
Map.Entry<String, BigDecimal> entry = itr.next();
String key = entry.getKey();
int count = Collections.frequency(hmap.values(), key);
countMap.put((key + count), sum.get(key));
itr.remove();
}
//For GC
sum = null;
countMap.forEach((k, v) -> System.out.println(k + " " + v));
}
В настоящее время GAE накладывает ограничение в 10 МБ на загрузку файла (и размер ответа), а также на многие другие вещи; так что даже если бы у вас было достаточно быстрое сетевое соединение, чтобы накачать более 10 МБ за 30 секунд, это было бы бесполезно. Google сказал (я слышал, что Гвидо ван Россум упомянул это вчера здесь, в Pycon Italia Tre), что у него есть планы преодолеть эти ограничения в будущем (по крайней мере, для пользователей GAE, которые платят за использование для превышения квот - не уверен, планы распространяются на пользователей GAE, которые не платят, и, как правило, должны соглашаться на меньшие квоты, чтобы получить бесплатное использование GAE).
вам нужно будет выполнить загрузку на другой сервер - я считаю, что 30-секундный тайм-аут нельзя обойти. Если есть способ, поправьте меня, пожалуйста! Я бы хотел знать, как это сделать!
Самое близкое, что вы могли бы сделать, это разбить его на части, как вы сохраняете его в GAE, а затем, когда загружаете, собираете вместе, отправляя отдельные запросы AJAX.
Я бы согласился с кусками данных в меньшие Blobs и имел бы две таблицы, одна содержит th метаданные (имя файла, размер, количество загрузок, ...и т.д.) и другая содержит куски, эти куски связаны с таблицей метаданных по инородному ключу, я думаю, что это выполнимо. ...
Или когда вы загружаете все части, вы можете просто сложить их вместе в один блок, имеющий одну таблицу.
Но проблема в том, что вам понадобится толстый клиент для обслуживания chunking-данных, например, Java-апплет, который должен быть подписан и доверен вашим клиентам, чтобы он мог получить доступ к локальной файловой системе
.Если время запроса истекает, вы мало что можете сделать. Возможно, ваши файлы слишком велики, и вам придется разбить их на части на клиенте (с помощью чего-то вроде Flash или Java или фреймворка для загрузки, например pupload).
После того как вы доставите файл в приложение, возникает другая проблема - ограничения хранилища данных. Здесь у вас есть два варианта: