2013-02-20 95 views
1

我的vb.net代码从1901年开始计算每个季度公司股票价格的增长率,并将其存储在数据表中。这需要一段时间(10-15分钟)。我想在计算后将信息保存在数据表中,这样我就不必每次运行程序时重新计算过去的增长率。当我打开我的程序时,我希望数据表包含任何已经计算的增长率,因此我只需计算新增季度的增长率。我应该如何使用数据库?

我应该将我的数据表存储在某种数据库中,还是有另一种方法来做到这一点?我的数据表非常大。它目前有450列(从1901年到现在每个季度一个),可以有成千上万的行(每家公司一个)。这对于Microsoft Access来说太大了吗? Microsoft Excel会成为一种选择吗?

谢谢!

+2

Excel(2007及更高版本)将容纳超过100万行,超过16,000列。访问可能是一个更好的数据库解决方案。或者,由于您只是存储数据,因此您可以写出一个txt分隔文件,然后解析该文件以进行计算。 – 2013-02-20 17:24:47

+0

@DavidZemens Zemens我对txt分隔文件很感兴趣。我以前想过这个,但我真的不知道该怎么去做。 – gromit1 2013-02-20 17:31:00

+0

哇。人们仍然使用Access吗?它感觉如此1997. – 2013-02-20 17:49:20

回答

2

Excel对表单的大小有限制,并且对于希望移植到不同结构的任何内容,您都不应该将其用作显式“数据库”。这对电子表格和会计一般来说很有用,但不应将其用于计算中所了解的绝对真实数据库。此外,Excel可以包含的记录数量有限制:Worksheet size 65,536 rows by 256 columns as of 2003

访问可能适用于此操作,但是根据您查看的记录数量,您可能会遇到文件大小问题,减速,只是一般的事情。在每次开始记录超过3000条记录的情况下,最好使用其中一个大型RDBM或类似的东西; Oracle,MySQL,SQL Server等

+1

> Excel 2007和2010中的104,000行和> 16,000列。Excel 2003是10年前的软件:)但除此之外,您是对的,它不是数据库的很好替代品。 – 2013-02-20 17:37:30

1

我认为主要问题可能是您设计数据库的方式。 每个季度的专栏听起来都不是很好的做法,尤其是当您每季度都必须更改数据库模式时。

您可以从MS Access数据库开始,然后如果您有任何性能问题,请迁移到SQL Server数据库或其他东西。

再次,我认为你应该仔细看看你的数据库设计。

+0

对于更好的数据库设计你有什么建议吗?我真的很陌生,这是我能想到的最好的。然而,知道每个季度的增长率是很重要的。谢谢! – gromit1 2013-02-20 17:30:08

+0

我已经研究过数据库设计,并且我相信我现在有足够的设计,但是我并没有试图将数据加载到互联网上。我的问题是在http://stackoverflow.com/questions/15160781/how-to-load-csv-files-from-the-internet-into-an-access-database。任何想法将不胜感激! – gromit1 2013-03-01 15:16:33

3

我会改变数据库设计:

  • ID
  • 季度
  • 公司名称
  • 值1
  • 值2
  • 值3

作为您的列,并开始将其保存为垂直表格。然后,你没有像你想象的那么多的数据,所以我会推荐一些免费的东西,比如mysql,甚至nosql,因为除了存储和检索数据之外,你什么都不做。任何基于文本的文件:您使用的xml,csv,.xls都会变慢,因为需要将整个文件加载到内存中才能解析它。

+0

难道你不能在内存中逐行读取文本文件吗?我想,不需要完全打开文件或将整个文件保存在内存中。 – 2013-02-20 17:38:16

+1

与csv的雅,你可以使用缓冲读者,xml通过节点/ xpath工作,xls没有机会,但如果你的数据是在文件的最后?墨菲定律。数据库提供索引作为解决方案。 – RandomUs1r 2013-02-20 17:42:30

+0

@ Syn123我已经研究过你的数据库设计,我相信我现在有足够的设计,但我并没有试图将数据加载到互联网上。我的问题是在http://stackoverflow.com/questions/15160781/how-to-load-csv-files-from-the-internet-into-an-access-database。任何想法将不胜感激! – gromit1 2013-03-01 15:17:09

1

我对股票数据有丰富的经验。测试了很多方法后,我认为对于一个简单的免费方法,您应该尝试使用SQL Server。您使用的数据量对于Access来说太多了(我想这不是您想要的唯一计算方式)。您可以免费使用SQL Server Express

对于这种设计,我会在名为HistoricalGrowthRate的SQL Server中创建一个数据库。我会为每个股票代码提供一个表格并将数据存储在那里。

完成此操作的一种方法是使用一个包含您希望遵循的所有符号(如果您没有可以使用纳斯达克的CompanyList.csv)的表的单独数据库。遍历该表中的每个符号并在HistoricalGrowthRate中运行创建表。当你想填充值时,只需再次循环并插入你的值。您也可以从Access导出,这对您来说会更快。

这将减少负载,当您呼叫的信息,并提供一个简单的方法来访问信息。所以,如果您想要AAPL的历史增长率,只需将连接字符串设置为HistoricalGrowthRate数据库,参考表AAPL并提取值。

+0

我很感兴趣!这听起来像我正在做很多类似的事情!我期待创建一个适当的数据库设计。我对您提到的纳斯达克的CompanyList.csv非常感兴趣。我究竟该如何下载? – gromit1 2013-02-22 19:27:45

+1

可以在www.nasdaq.com/screening/company-list.aspx(页面底部)找到它们。此外,还有一个代码文章使用Maas的雅虎财务API获取65k左右的代码(http://stackoverflow.com/questions/5246843/how-to-get-a-complete-list-of-ticker-symbols-from -yahoo-finance),查看jm1102的回复。我不得不稍微修改它,但效果很好。 – MonkeyDoug 2013-02-22 21:58:30

+1

关于股票数据库设计:(这是我喜欢的,它不是唯一的方法去做它的道理)对于我参考的很多东西,我喜欢在概念上将它们放在单独的数据库中。我可能有一个像增长率,PE或Price/Book这样的关键计算。我可能有另一个历史价格和一个盘中。我把它们放在一起,所以它们存在于对我有意义的地方,而且我经常不仅需要一个计算器,而且同时需要很多计算器。 – MonkeyDoug 2013-02-22 22:27:26

4

首先,目前还不清楚你是否需要的一个数据库。如果你不需要诸如并发访问,客户端/服务器操作,ACID事务等等......你可能只需要使用文件系统来实现你的缓存。

如果你总结出你确实需要一个DBMS,那么有很多很好的选择,包括免费的,比如:PostgreSQL,MS SQL Server Express,Oracle Express,MySQL,Firebird,SQLite等......或者商业如:Oracle, MS SQL服务器,IBM DB2中,Sybase等..

我建议你让你的数据模型灵活,所以您不必到每个新季度增加新列:

enter image description here

这模型也非常适合于clustering(如果您选择的DBMS支持它),所以属于同一家公司在物理上紧密地存储在数据库中,可能会在查询期间降低I/O。或者,您可以选择按年/季度分组。

相关问题