社区首页 >问答首页 >如何根据属性对超过一百万个项目进行快速分组

如何根据属性对超过一百万个项目进行快速分组
EN

Stack Overflow用户
提问于 2020-03-02 00:57:53
回答 2查看 90关注 0票数 2

我构建了一个程序来解析Fix消息列表,并将它们存储为引用消息。这些修复消息的形式是超过1.5 in的压缩文本文件。

代码语言:javascript
代码运行次数:0
复制
public class Contract
{
    public string ExchangeId { get; set; } = "?";
    public string ExchangeSymbol { get; set; } // Setting this property in my code.
    // I also group Quote by this property below in my dictionary, see below.
}


public class Quote
{
   public Contract Contract = new Contract();
   public decimal Ask = 0M;
   public decimal Bid = 0M;
   // ...
}

public class QuoteMessage
{
   public List<Quote> Quotes = new List<Quote>();
   // ...
}

每个QuoteMessage可以有多个引号。我将它们存储在List<QuoteMessage>中。在这个列表生成之后,我需要根据他们的合同存储报价(而不是报价消息)来分析它们。为此,我运行一个SelectMany并从每个QuoteMessage中提取一个引号列表,将它们输入到Dictionary<Contract, List<Quote>>字典中。在初始化字典时,我要确保有合适的IComparable<Contract>

问题是,列表中的每个元素几乎需要半个小时才能遍历,并将它们插入字典中:

代码语言:javascript
代码运行次数:0
复制
public Dictionary<Contract, List<Quote>> SortQuoteByContract(List<Quote> quotes)
{
    var contractDict = new Dictionary<Contract, List<Quote>>(new IComparable<Contract>());
    foreach (Quote quote in quotes)
    {
        if (!contractDict.ContainsKey(quote.Contract))
        {
            contractDict[quote.Contract] = new List<Quote>();
        }
        contractDict[quote.Contract] = quote; // Line A

    return contractDict;
}

有没有办法加快速度呢?据我所知,我并没有创建引用本身的任何副本(在A行上),只是在<Contract, List<Quote>>字典中存储了一个指向其在内存中位置的指针。这是正确的吗?我想让这个分组尽可能快。一旦报价按合同分组,我就可以在几秒钟内对所有报价进行分析。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2020-03-02 01:43:25

如果你正在寻找优化,你应该找到发生内存分配的地方。在您的情况下,每次创建新列表时都会发生分配,并且每次向列表中添加项目时都可能发生分配。

采取另一种完全不使用字典的方法:按约定对列表进行排序,然后遍历列表。

假设您有一个单独的批处理处理器类:

代码语言:javascript
代码运行次数:0
复制
interface IContractBatchProcessor
{
     void OnContractStart(Contract contract);
     void ProcessQuote(Quote quote);
     void OnContractEnd()
}

现在,您可以像这样处理列表:

代码语言:javascript
代码运行次数:0
复制
static int CompareByContract(Quote q1, Quote q2) 
{
    // TODO
}

void Process(List<Quote> quote, IContractBatchProcessor processor)
{
    list.Sort(CompareByContract);
    Contract lastContract = null;
    foreach(var quote in list)
    {
        if(quote.Contract != lastContract)
        {
            if(lastContract != null)
            {
                processor.OnContractEnd();
            }
            processor.OnContractStart(quote.Contract);
            lastContract = quote.Contract;
        }
        processor.ProcessQuote(quote);
    }
    processor.OnContractEnd();
}

这是在运行接受委托作为参数的List.Sort method

这种方法会更快,因为您正在执行列表的就地排序,因此没有额外的内存分配。

票数 0
EN

Stack Overflow用户

发布于 2020-03-02 03:06:17

使用PLINQToLookup的代码肯定会比您当前的代码更快。它也很容易阅读,而且从方法使用者的角度来看,也很容易使用。

它将要求您在Contract类中覆盖EqualsGetHashCode,或者编写一个实现IComparer<Contract>的类,该类只是EqualsGetHashCode的外部接口。

代码语言:javascript
代码运行次数:0
复制
public ILookup<Contract, Quote> SortQuoteByContract(List<Quote> quotes) =>
    quotes.AsParallel().ToLookup(_ => _.Contract);

public ILookup<Contract, Quote> SortQuoteByContract(List<Quote> quotes) =>
    quotes.AsParallel().ToLookup(_ => _.Contract, new ContractComparer());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60481258

复制
相关文章
腾讯把数据中心放在了贵州哪里? | 拔刺
--- 拔出你心中最困惑的刺!--- 在这个用过即弃的时代,不要让你的求知欲过期。 今日拔刺: 1、 腾讯把数据中心放在了贵州哪里? 2、身为无人机发展强国的以色列,为什么要从中国采购万架大疆无人机?
镁客网
2018/06/28
2.3K0
把焦点放在“人”上
企业架构是个有30多年历史的技术领域,一贯给人“高深莫测”、“口若悬河”、“青云直上”的感觉,诗意一点儿的话,很多人认为这是“两只黄鹂鸣翠柳、一行白鹭上青天”(翻译过来就是“不知所云、离题万里”)。但是,“中台”这两年的火热,在笔者看来,实属企业架构方法论的“重新发现”,仔细看看每一张“中台”架构图,哪一张不是在全面阐述“企业架构”?而很多尝试的企业在实践中台时遇到的一个问题是:照着描却这么也描不像。笔者对方法论一直是持开放态度,尊重每一种方法论,也认为对每一种方法论的辨析都应该基于对实践的充分了解,而非道听途说。但是毕竟能接触到的实践机会有限,在此也只能违背自己的原则,试着谈论几句。
用户6900693
2020/11/10
6390
把焦点放在“人”上
你的SQL语句放在了哪里?
这段时间整理自然框架,遇到了一个老问题——SQL语句放在哪里? 对于有规律的比较好办了,但是对于哪些没啥规律的怎么办呢? 想了一下,有几种方式,弄了张图。欢迎大家补充。 因为 有字数限制,必须200字
用户1174620
2018/02/08
1.3K0
你的SQL语句放在了哪里?
Win10怎样把我的电脑放在桌面上?
1、点击[桌面] 2、点击[个性化] 3、点击[主题] 4、点击[桌面图标设置] 5、点击[计算机] 6、点击[确定]
裴来凡
2022/05/28
9250
Win10怎样把我的电脑放在桌面上?
云数据隐私:将密钥放在哪里?
在任何工作负载迁移项目计划中,最容易被忽视的项目通常是跨多个云服务的密钥管理和合规性。增强自带密钥(BYOK)服务使企业可以将数据位置与加密密钥分开。加密最佳实践有助于提高数据隐私性。
静一
2021/06/01
2.8K0
git clone下来的代码放在哪里,如何放在指定路径
但是话说我的东西下载到哪里去了呢????摸不着头脑,然后百度之,发现一般会放在命令行对应的路径下,也就是
全栈程序员站长
2022/09/16
4K0
git clone下来的代码放在哪里,如何放在指定路径
你将你的Helm chart放在哪里?
无论你喜欢与否,你都不得不承认Helm是管理Kubernetes应用程序独一无二的工具,你甚至可以通过不同的方式使用它。
不会飞的小鸟
2020/06/03
2.5K0
2019年CIO应该把钱花在哪里?这个调查告诉你
新的一年,许多CIO都在考虑把预算放在哪个方向,对哪些领域的预算增加一些,对哪些领域的投资减少一些。
人称T客
2019/05/08
4870
2019年CIO应该把钱花在哪里?这个调查告诉你
解决把listview放在ScrollView只显示一行的问题
这种问题是需要重新去计算  listview的条数,不管你是一次性加载,很多可以分页加载  
wust小吴
2019/07/08
9970
这家人工智能公司告诉你应该把钱投向哪里
在2000年代中期的某个时候,对冲基金所有者想出了一个点子。金融市场是受新闻影响的—所以如果你能彻底地理解新闻,而且能非常迅速,那你就能抢在市场变化前面。利用人工智能技术,他们设计了一种软件,能实时分析爆炸性新闻,评估新闻的意义,并且能在数秒内根据上述分析进行交易。 就像在对冲基金领域的很多事情一样,这种人工智能技术仍然只是亿万富豪和专业投资者的专属。但是Amareos,一家香港创业企业,正想法设法将这项技术带给普通的投资人。 测量世界的温度 “我们尽力将大数据技术民主化,”Philippe EI-As
点滴科技资讯
2018/04/28
2.7K0
这家人工智能公司告诉你应该把钱投向哪里
昇腾 AI:“把开发者放在心上,把产业发展放在心上” | Q推荐
作者 | 鲁冬雪 昇腾 AI 开发者创享日是面向开发者的全国巡回活动,旨在汇聚区域伙伴、科研院所及高校人才,通过最前沿的技术思考、最纯粹的技术分享、最真实的动手体验,为其提供一个深度探讨与交流的平台。过去一年里,昇腾 AI 开发者创享日先后在西安、成都、南京等城市成功举办。每次活动都会引发 AI 圈内及当地众多开发者的追捧,活动现场热闹非凡,众多媒体争相报道。 那么,这个活动的魅力究竟在哪?相同类型的活动很多,为什么单单“昇腾 AI 开发者创享日”的活动可以场场爆满?为什么能够吸引来那么多媒体进行报道?当
深度学习与Python
2023/03/29
3380
昇腾 AI:“把开发者放在心上,把产业发展放在心上” | Q推荐
EditText把光标放在文本的末尾处
当手动设置EditText的文本时,光标会恢复到最前面,可以再监听中设置光标到末尾处,这样就好了,大家有什么问题可以在下方留言。
程思扬
2022/01/11
5790
JWT应该保存在哪里?
最近几年的项目我都用JWT作为身份验证令牌。我一直有一个疑问:服务端发放给浏览器的JWT到底应该存储在哪里?这里只讨论浏览器的场景,在这个场景里有三种选择。
码农小胖哥
2021/10/19
2.2K0
Docker镜像详谈(3): 镜像内容存放在哪里?
据说重要的事情要说三遍,那我再表述一下个人观点:Docker 镜像是 Docker 的灵魂所在。
Henry Zhang
2019/04/12
8.6K0
Docker镜像详谈(3): 镜像内容存放在哪里?
龟叔帮助微软把Python放在了Excel
微软宣布在 Excel 中加入 Python,也就是说我们可以在 Excel 中使用 Python 的强大功能。可以直接在单元格中键入 Python,Python 计算在 Microsoft 云中运行,结果将返回到工作表,包括绘图和可视化效果。
somenzz
2023/09/20
3150
龟叔帮助微软把Python放在了Excel
Spring Boot 中的静态资源到底要放在哪里?
当我们使用 SpringMVC 框架时,静态资源会被拦截,需要添加额外配置,之前老有小伙伴在微信上问松哥Spring Boot 中的静态资源加载问题:“松哥,我的HTML页面好像没有样式?”,今天我就通过一篇文章,来和大伙仔细聊一聊这个问题。
江南一点雨
2019/08/30
2K0
Spring Boot 中的静态资源到底要放在哪里?
前端工作两年,应该把精力放在 Vue 上还是 JS、React、工程化上?| 极客时间
最近不少读者反馈说,“感觉前端市场饱和了”“前端找工作好难”“工资再低都没人要”“投 100 个简历石沉大海”。 实际上,准确来说,是「初级前端没人要」。 随着 W3C 的极力推广,目前 IT 界前端程序员的需求量仅次于 Java 岗位。而且看 GitHub 的数据,JavaScript 的热度常年保持榜首位置,TypeScript 也是飞速上涨,热度飙升。如果前端真的有所谓的“饱和”,那真的是大部分人都要失业了。 前端缺口很大,但进大厂依然很难。 饱和的不是市场,饱和的是那不知天高地厚的心。 当然,现在
深度学习与Python
2023/04/30
5110
前端工作两年,应该把精力放在 Vue 上还是 JS、React、工程化上?| 极客时间
"struts中文问题","struts国际化问题"的终极解决方案[转载]
Java本身就支持多国语言编码,不需要写任何程序,可以很简单的 实现。 秘诀就是两点:
源哥
2018/08/28
6200
点击加载更多

相似问题

我应该把",“放在哪里?

10

在chrome开发工具中,我应该把断点放在哪里?

20

我应该把css放在哪里?

22

我应该把if语句放在哪里?

24

我应该把索引放在哪里?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文