我有一个约150mb的简单文本文件.我的代码将读取每一行,如果它匹配某些正则表达式,它将被写入输出文件.但是现在,只需要很长时间来遍历文件的所有行(几分钟)就可以了
File.open(filename).each do |line|
# do some stuff
end
Run Code Online (Sandbox Code Playgroud)
我知道这是循环文件的线路需要一段时间,因为即使我对"#do some stuff"中的数据什么都不做,它仍然需要很长时间.
我知道有些unix程序几乎可以立即解析像这样的大文件(比如grep),所以我想知道为什么ruby(MRI 1.9)需要这么长时间才能读取文件,有没有办法让它更快?
我有一堆产品,每种产品都有许多不同的可能属性.例如,产品A具有名称,大小,颜色,形状.产品B有名称,卡路里,糖等.解决这个问题的一种方法是:
1)创建表
Products (id, name)
Attributes (id, name)
Product_Attributes (product_id, attribute_id, value as string)
Run Code Online (Sandbox Code Playgroud)
这允许最大的灵活性,但我听到很多人建议反对这个,虽然我不知道为什么.我的意思是,如果这些表被称为团队,玩家,Team_Players,我们都同意这是适当的关系设计.
每个向我解释为什么这么糟糕的人都会在一个完全灵活的关系设计的环境中这样做,你不会创建真正的表通过基本的几个基本初始表(例如object,attribute,object_attribute) - 我认为我们所有人都同意是坏事.但这是一个更加有限和包含的版本(只有产品,而不是系统中的每个对象),所以我认为将这两种架构组合在一起并不公平.
您遇到的哪些问题(经验或理论上的问题)使这个设计如此糟糕?
2)解决这个问题的另一种方法是创建一个Product表,其中包含一些列,如Size,Color,Shape,Weight,Sugar等,然后在末尾包含一些额外的列,以便为我们提供一些灵活性.这将创建通常稀疏的行,主要填充NULL.人们倾向于喜欢这种方法,但我的问题是,在此方法失去性能优势之前,您可以拥有多少列?如果你有200列,我想这不再是一个聪明的举动,但100列呢?50列?25列?
3)我所知道的最后一种方法是将所有属性作为blob(可能是JSON)存储在Products表的单个列中.我喜欢这种方法,但感觉不对.查询很难.如果您希望以后能够轻松更改属性的名称,则必须单独解析每个记录,或者通过某个ID将它们键入blob中.如果你去id路径然后你将需要另一个表属性,事情开始看起来像上面的方法#1,除了你将无法将你的blob加入attribute_id,所以我希望你不想查询任何东西按属性名称.
我喜欢这种方法的是你可以查询一个产品,在你的代码中你可以快速地访问它拥有的所有属性.如果删除产品,则无需清理其他表 - 易于保持一致.
4)我已经阅读了一些关于能够在某些RDBMS中索引强类型xml格式的东西,但老实说我对这种方法知之甚少.
我被卡住了.我认为方法#1是最好的选择,但我读到的所有内容都说这样的方式很糟糕.考虑这个问题的正确方法是什么,以便能够确定给定情况的最佳方法是什么?明显欢迎比我列出的更多的想法!
sql relational-database database-agnostic entity-attribute-value
我正在考虑为数据库设计一个从不实际删除任何内容的关系数据库模式(设置已删除的标志或其他内容).
1)通常使用哪些元数据列来容纳这样的架构?显然,可以设置IsDeleted的布尔标志.或者也许只是删除列中的时间戳更好,或者两者兼而有之.从长远来看,我不确定哪种方法会给我带来更多问题.
2)如何在这种架构中处理更新?如果将旧值标记为已删除并插入新值,则会遇到PK唯一约束问题(例如,如果您有PK列ID,则新行必须与您刚标记为无效的ID具有相同的ID,或者否则,该id的其他表中的所有外键都将变得无用).
我有一个Web应用程序,它使用Guids作为数据库中的PK,用于Employee对象和Association对象.
我的应用程序中的一个页面返回大量数据,显示所有员工可能参与的所有关联.
所以现在,我发送给客户端本质上是一堆看起来像这样的对象:
{assocation_id: guid, employees: [guid1, guid2, ..., guidN]}
Run Code Online (Sandbox Code Playgroud)
事实证明,许多员工属于许多协会,所以我在这些不同的对象中一遍又一遍地为这些员工发送相同的Guids.例如,在某些情况下,我可能会在所有协会中发送总计30,000个guid,其中只有500名独特的员工.
我想知道是否值得我构建一些我也发送给客户端的查找索引
{ 1: Guid1, 2: Guid2 ... }
Run Code Online (Sandbox Code Playgroud)
并用这些整数替换我发送的对象中的所有Guid,
或者,如果只是简单地压缩响应会压缩它,这种额外的努力是不值得的?
注意:请不要了解我是否应该发送30,000条数据的细节 - 这不是我的选择,我无能为力(我也无法改变Guids)在DB中的内部或长期).
我刚刚将分支A合并到B中,由于某种原因合并不顺利.我希望将B恢复到合并之前的状态,然后重新尝试,就像之前从未发生过一样.我在考虑做的事情
hg clone myrepo newrepo -r A -r 12345
Run Code Online (Sandbox Code Playgroud)
其中12345是B的错误合并提交之前的修订号
我认为这有效,但我有很多其他分支(大多数分支使用commit --close-branch关闭),这会使这些分支回到非活动状态.
有没有办法克隆除修订版123456之外的所有东西?(其中123456是B上的错误提交)
我做了一些修改(称之为修订版B).然后我hg up A回到了早期版本来修复一些bug.忘记我已经完成了这个更新,我意识到我已经将我的最后一次更改提交到了错误的分支.所以我hg rollback要摆脱那个提交(B).它做得很好,但现在我坐在修订版A的旧代码,我的最后一次提交已经消失,并hg st说一切都是最新的A.
我猜我丢失了提交B的所有内容?有没有办法让它回来?
编辑:我没有把它推到任何地方,这一切都发生在当地
我有一个脚本是我的部署过程的一部分,用于将数据库更改推送到生产服务器.如果脚本由于某种原因(更新错误)破坏了我的数据,则很难恢复.
解决此问题的一种方法是在更新时关闭应用程序,因此如果出现问题,只需返回我在部署之前所做的备份.
但是我听说有其他人部署并保持他们的网站正常运行...你将如何做到这一点,如果你失败了,你怎么能恢复自部署之前你的备份以来的数据?
我有两个分支Dev和Feature1.我正在开发Feature1,创建所述功能并提交它.然后我编写了Feature2的代码,但是在Feature1分支而不是新分支(Feature2)下提交了它.所以现在我在Feature1分支中有两个功能作为两个单独的提交,但我只想将第二个功能包含在Dev中.
做这件事的多变方法是什么?
我想要一个显示最多N个小数位的函数,但如果不需要则不填0,所以如果N = 2,
2.03456 => 2.03
2.03 => 2.03
2.1 => 2.1
2 => 2
Run Code Online (Sandbox Code Playgroud)
我看到的每个字符串格式化的东西都会填充2到2.00之类的值,这是我不想要的
我有一个List<object>.我想循环遍历列表并以更友好的方式打印出值,而不仅仅是o.ToString()在某些对象是布尔值或日期时间等情况下.
你将如何构造一个我可以调用的函数MyToString(o)并返回一个正确格式化的字符串(由我指定)作为其实际类型?
mercurial ×3
c# ×2
mysql ×2
oracle ×2
postgresql ×2
sql-server ×2
.net ×1
gzip ×1
optimization ×1
performance ×1
rdbms ×1
ruby ×1
sql ×1