天道酬勤,学无止境

在什么时候使用数据库值得?(At what point is it worth using a database?)

问题

我有一个与数据库有关的问题,在什么时候值得探讨。 我主要是一名嵌入式工程师,但是我正在使用Qt编写一个与我们的控制器接口的应用程序。

我们处于一个奇怪的地方,那里有足够的数据,因此可以实施一个数据库(大约700多个项目并且不断增长)来管理所有内容,但是我不确定现在是否值得处理。 使用从excel生成并解析的文件来实现GUI时,我没有任何问题,但是即使使用VBA脚本,它也很繁琐且难以跟踪。 我一直在尝试使用Microsoft Access将数据转换为应用程序端更可管理的数据,并且似乎运行良好。 如果能解决问题,我距离使用SQL数据库和使用Qt库访问和修改它仅一步(或几步)。

我没有在此级别上管理数据的丰富经验,并且很好奇也许是解决此问题的最佳方法。 那么,在这种情况下使用数据库的真正好处是什么? 我意识到其中很多可能是特定于应用程序的,但是有关如何跨越嵌入式/应用程序编程线的一些一般性想法和建议将有所帮助。

这与将数据库放入嵌入式项目无关。 它也不是通常使用较大数据库的业务类型应用程序。 我正在为桌面上的单个用户设计一个GUI,以便与微控制器进行接口以进行监视和配置。


我决定使用SQLite。 您可以使用一些数据来做一些非常有趣的事情,这些数据在我第一次启动该项目时就没有考虑过。

回答1

在以下情况下,值得使用数据库:

  1. 您的应用程序演变为某种形式的数据驱动执行。
  2. 您正在花时间设计和开发外部数据存储结构。
  3. 在应用程序或组织(包括个人)之间共享数据
  4. 数据不再简短。
  5. 资料复制

向数据驱动执行的演进
当数据更改但执行没有更改时,这表示数据驱动程序或该程序的某些部分是数据驱动的标志。 一组配置选项是数据驱动功能的标志,但是整个应用程序可能不是数据驱动的。 无论如何,数据库都可以帮助管理数据。 (数据库库或应用程序不必像Oracle那样庞大,但可以像SQLite那样精简和有意义)。

外部数据结构的设计与开发
Stack Overflow发布有关序列化或将树和列表转换为使用文件的问题,可以很好地表明您的程序已经毕业于使用数据库。 同样,如果您花费大量时间设计算法来将数据存储在文件中或设计数据在文件中,则是研究数据库使用情况的好时机。

共享资料
无论您的应用程序是与另一个应用程序,另一个组织还是另一个人共享数据,数据库都可以提供帮助。 通过使用数据库,可以更轻松地实现数据一致性。 问题调查中的一大问题是团队没有使用相同的数据。 客户可以使用一组数据; 验证团队将使用另一个不同的数据集进行开发。 数据库使对数据的版本控制更加容易,并允许实体使用相同的数据。

复杂数据
程序从使用小型硬编码数据表开始。 这演变成将动态数据与地图,树和列表一起使用。 有时,数据从简单的两列扩展到8或更多。 数据库理论和数据库可以减轻组织数据的复杂性。 让数据库为管理数据而烦恼,从而释放您的应用程序和开发时间。 毕竟,数据的管理方式并不像数据的质量及其可访问性那么重要。

资料复制
通常,当数据增长时,重复数据的吸引力越来越大。 数据库和数据库理论可以最大程度地减少数据重复。 可以将数据库配置为警告重复。

转向使用数据库有许多因素需要考虑。 其中一些包括但不限于:数据复杂性,数据重复(包括部分数据),项目期限,开发成本和许可问题。 如果您的程序可以在数据库上更有效地运行,则可以这样做。 数据库还可以节省开发时间(和金钱)。 除了管理数据,您和您的应用程序还可以执行其他任务。 将数据管理交给专家。

回答2

您所描述的内容听起来并不像典型的业务应用程序,并且此处已经发布的许多答案都假定您正在谈论的是这种类型的应用程序,所以让我提供不同的看法。

是否使用700个项目的数据库将在很大程度上取决于数据的性质。

我想说,在这种规模的情况下,大约有90%的时间,您将从SQLite之类的轻量级数据库中受益,前提是:

  1. 数据可能会大大超出您所描述的范围,
  2. 数据可以由多个用户共享,
  3. 您可能需要对数据运行查询(我认为您现在不在执行此操作),并且
  4. 数据可以很容易地以表格形式描述。

另外10%的时间,您的数据将具有高度结构化,层次结构,基于对象的功能,并且不能完全适合数据库或Excel表的表模型。 如果是这种情况,请考虑使用XML文件。

我知道开发人员本能地喜欢将数据库抛出这样的问题,但是如果您当前正在使用Excel数据来设计用户界面(或显示配置设置),而不是显示客户记录,那么XML可能更合适。 XML比Excel或数据库表更具表现力,并且可以使用简单的文本编辑器轻松地进行操作。

易于找到C ++的XML解析器和数据绑定器。

回答3

我建议您在您的应用程序中引入一个数据库,您的应用程序将获得灵活性,并且将来会更容易维护和改进新功能。
我将从像Sqlite这样基于轻量级文件的数据库开始。
通过精心设计的数据库,您将拥有:

  1. 减少数据冗余
  2. 更高的数据完整性
  3. 改善数据安全性

最后但并非最不重要的一点是,使用数据库可将您从Excel导入/更新/导出地狱中解救出来!

回答4

使用数据库的原因:

  • 并发写入。 在数据库中轻松实现并发
  • 易于查询。 SQL查询往往比过程代码简洁得多,以搜索数据。 更新,INSERT INTO也可以用很少的代码完成很多工作
  • 正直。 约束非常容易定义,无需编写代码即可执行。 如果您具有非null约束,则可以放心该值不会为null,无需在任何地方编写检查。 如果您有外键约束,则不会有“悬挂引用”。
  • 大型数据集的性能。 将索引添加到SQL数据库非常简单

不使用数据库的原因:

  • 它往往是一个额外的依赖项(尽管存在非常轻量级的数据库-例如,我喜欢Java的H2)
  • 数据不太适合关系模式。 基本上是键/值映射的事物。 XML(尽管数据库通常支持XPath等)。
  • 有时文件更方便。 可以使用纯文本编辑器对它们进行差异化,合并,编辑等。有时电子表格可能更实用(您无需构建编辑器即可使用电子表格程序)
  • 您的数据已经在其他地方
回答5

当您拥有大量数据时,您不确定将来将如何利用它们。

例如,您可能想在嵌入式应用程序中添加一个SQLite数据库,该数据库需要注册不确定如何使用的统计信息。 稍后,您将完整的数据库发送到更大的数据库中进行注入,该数据库在中央服务器上运行,并且可以使用请求轻松利用这些数据。

实际上,如果您的应用程序的目的是“收集数据”,那么拥有数据库是必须具备的。

回答6

我看到数据库很好地满足了许多要求:

1)。 临时查询。 找到符合条件Y的所有{X}

2)。 具有可从规范化中受益的结构数据-将公用值分解为单独的“表”。 这样可以节省空间并减少出现不一致的可能性。 完成此操作后,这些临时查询将开始真正有用。

3)。 大数据量。 专业的数据库非常善于利用资源,巧妙的查询优化和分页策略。 尝试自己编写这些东西是一个真正的挑战。

您显然不需要最后一个,但其他两个也许确实适用于您。

回答7

不要忘记,根据您的要求,适当的数据库可能会完全不同(也不要忘记,如果您的要求足够简单,则可以将文本文件用作数据库-例如,配置文件只是特定的种数据库)。 这些参数可能是:

  • 记录数
  • 数据项的大小
  • 数据库是否需要与其他设备共享? 同时?
  • 各个数据之间的关系有多复杂
  • 数据库是只读的(例如,在构建时创建但未更改)?
  • 是否需要同时由多个实体更新数据库?
  • 您需要支持复杂的查询吗?

对于具有700个条目的数据库,从文本文件加载内存中排序的数组可能是合适的。 但是我还可以看到需要嵌入式SQL数据库,或者让控制器通过网络连接从数据库中请求数据,具体取决于各种要求(和资源限制)。

回答8

没有哪个值得数据库值得关注的地方。 相反,我通常会问以下问题:

  • 应用程序使用/创建的数据量是否在增长?
  • 数据增长的上限是否未知(或不清楚)?
  • 应用程序是否需要聚合或过滤此数据?
  • 数据将来可能不会很明显地用于将来吗?
  • 数据检索和/或存储的性能重要吗?
  • 应用程序中是否有(或可能有)多个共享数据的用户?

如果我对大多数问题都回答“是”,那么我几乎总是选择一个数据库(与其他选项(例如XML / ini / CSV / Excel /文本文件或文件系统)相对)。

另外,如果应用程序将有许多可以同时访问数据的用户,我将倾向于使用完整的数据库服务器(MySQL,SQl Server,Oracle等)。

但是通常在单个用户(或少量并发)的情况下,不能击败SQLite之类的本地数据库以实现可移植性和易于部署。

回答9

补充一点:由于不确定的延迟,因此不适合实时处理。 但是,例如在启动期间查找和设置操作参数就足够了。 我不会将数据库访问放在关键的时间路径上。

回答10

如果在一个或两个表中有数千行要在单个用户应用程序中处理(对于嵌入式点),则不需要数据库。

如果它用于多个用户(并发访问,锁定)或需要事务,则应明确考虑使用数据库。 在规范化的表中处理复杂的数据结构并保持完整性,否则大量数据将是您应该使用数据库的另一种指示。

回答11

听起来您的应用程序正在台式计算机上运行,​​并且只是在与嵌入式设备通信。

因此,使用数据库更为可行。 在嵌入式平台上使用它是一个复杂得多的问题。

在台式机上,当需要连续存储新信息并且需要以关系方式提取该信息时,我将使用数据库。 我不使用数据库来存储静态信息,即在加载时读取一次的信息,仅此而已。 例外情况是应用程序有许多用户,并且需要按每个用户存储此信息。

在我看来,这就像您从嵌入式设备中收集信息,以某种方式存储它,然后在以后使用它通过GUI进行显示一样。

这是使用数据库的一个好案例,特别是如果您可以对系统进行架构设计,使得有一个数据收集守护程序来管理与嵌入式设备的持续通信。 然后,该应用程序可以将数据写入数据库。 启动GUI时,它可以提取数据以显示。

如果需要显示不同的视图,例如“显示两个日期之间的所有条目”,则使用数据库还可以简化GUI的开发。 对于数据库,您只要求它提供正确的值即可通过适当的SQL查询显示,并且GUI显示返回的内容,从而使您可以将许多“业务逻辑”代码与GUI分离。

回答12

我们也面临着类似的情况。 我们有来自不同测试设置的数据集,目前已将其转储到excel工作表中,并使用Perl或VBA处理。

我们发现此方法存在很多问题:

一世。 使用Excel工作表管理数据非常麻烦。 一段时间后,您将拥有大量的Excel工作表,并且没有简单的方法可以从中检索所需的数据。

ii。 人们开始通过电子邮件来回发送excel表格以进行评论和审阅。 电子邮件成为管理与数据相关的注释的主要模式。 这些评论将在以后的某个时间点丢失,并且无法取回。

iii。 创建了文件的多个副本,一个副本中的更改未反映在另一个副本中-没有版本控制。

出于同样的原因,我们决定迁移到基于数据库的解决方案,并且目前正在研究该解决方案。 让我总结一下我们正在尝试做的事情:

一世。 该数据库位于所有测试设置中可由PC访问的中央服务器中。

ii。 生成后,所有数据都会进入一个临时位置(文件中为本地硬盘)。 通过后台运行的进程将这些文件从文件中推送到数据库中(因此,即使出现网络问题,本地文件系统中也会存在数据)。

iii。 我们有一个基于Web的应用程序,允许用户以所需的格式登录和访问数据。 该门户网站将允许他们添加评论,生成不同类型的报告,在审阅后与其他用户共享评论等。它还具有将数据导出到excel工作表的功能,以防万一您需要随身携带。

让我们知道这是否可以更好地实现。

回答13

“在什么时候使用数据库值得?”

是否以及何时需要管理数据?

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Maven在理论上和实践上做什么? 什么时候值得使用? [关闭](What does Maven do, in theory and in practice? When is it worth to use it? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我将开始一个Java项目只是为了练习。 我已经读过有关Maven的文章,但实际上我并不了解何时应该使用它。 能给我一些实用的技巧吗? Maven有很多帮助吗? Maven实际上为我的项目做什么? 回答1 它能做什么 Maven是“构建管理工具”,它用于定义.java文件如何编译为.class ,打包为.jar (或.war或.ear )文件,(使用工具进行(预先/后)处理),管理CLASSPATH的方式,以及构建项目所需的所有其他任务。 它类似于C / C ++中的Apache Ant或Gradle或Makefiles,但是它试图完全独立,通过合并其他常见任务(如下载和安装必要的库等),您不需要任何其他工具或脚本。 它还围绕“构建可移植性”主题进行设计,因此不会出现问题,因为在一台计算机上而不是另一台计算机上使用相同的构建脚本具有相同的代码(这是已知问题,我们拥有Windows VM 98台计算机,因为我们无法在其他任何地方编译我们的某些Delphi应用程序)。 因此,这也是使用不同IDE的人之间进行项目工作的最佳方法
  • 是否值得在客户端哈希密码(Is it worth hashing passwords on the client side)
    问题 当我想放置一个登录系统时,我总是将给定密码的MD5与服务器端的users表中的值进行比较。 但是,我的一个朋友告诉我,网络软件可能会嗅到“清除”密码。 所以我的问题是:在客户端哈希密码是否是一个好主意? 它比在服务器端对其进行哈希处理更好吗? 回答1 基本上,您的朋友是对的。 但是,简单地散列在客户端的密码是不是提交它以纯文本的服务器才刚刚好。 可以侦听您的纯文本密码的人当然也可以侦听哈希密码,并使用这些捕获的哈希值来对您的服务器进行身份验证。 为此,通常通过允许客户端选择一堆随机位(随密码一起散列),以确保更可靠的身份验证协议通常无法跳过,从而确保这种重播攻击不起作用。 ,并且还明确地提交给服务器。 在服务器上: 产生一些随机将这些位(以明文形式)发送给客户端 在客户端上: 产生一些随机位连接密码,服务器的随机位和客户端的随机位生成上面的哈希提交随机位(以明文形式)并哈希到服务器 由于服务器知道自己的随机信息以及客户端的随机位(以明文形式获取它们),因此它可以执行基本相同的转换。 该协议可确保,只要双方都每次都产生不同的“噪声位”,那么在此对话中收听的任何人都无法稍后使用该信息来对记录的信息进行错误的身份验证(除非使用了非常弱的算法...),进行了握手。 编辑所有这些都是容易出错和乏味的,并且很难正确处理(阅读:安全)。 如果可能的话
  • 增加PHP memory_limit。 在什么时候变得疯狂?(Increasing PHP memory_limit. At what point does it become insane?)
    问题 在我目前正在使用的系统中,有一个过程将大量数据加载到数组中以进行排序/聚合/处理。 我知道此过程需要针对内存使用进行优化,但是从短期来看,它只是需要工作。 给定加载到数组中的数据量,我们将继续达到内存限制。 它已经增加了好几次,我想知道在某种程度上增加它通常是个坏主意吗? 还是仅取决于计算机有多少RAM? 机器具有2GB的RAM,当前的memory_limit设置为1.5GB。 我们可以轻松地向计算机添加更多RAM(并且无论如何都可以)。 其他人遇到过这种问题吗? 有什么解决方案? 回答1 在服务器网页上作为Apache模块运行的PHP memory_limit的配置必须考虑您在计算机上可以同时拥有多少个Apache进程-请参阅Apache的MaxClients配置选项。 如果MaxClients为100,并且您具有2,000 MB RAM,则非常快速的计算将显示您不应使用超过20 MB *(因为20 MB * 100个客户端= 2 GB或RAM,即服务器具有的总内存量)*作为memory_limit值。 而且这并没有考虑到同一台服务器上可能还有其他东西在运行,例如MySQL,系统本身……而Apache可能已经在为自己使用一些内存。 或者,当然,这也是“最坏的情况”,它认为每个PHP页面都在使用它可以使用的最大内存量。 在您的情况下,如果仅一项工作就需要如此大的内存
  • 单元测试值得吗? [关闭](Is Unit Testing worth the effort? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 我正在努力将单元测试集成到我所工作的团队的开发过程中,并且有些怀疑论者。 有什么好的方法可以使怀疑的开发人员相信团队中单元测试的价值? 在我的特定情况下,我们将在添加功能或修复错误时添加单元测试。 不幸的是,我们的代码库无法使其易于测试。 回答1 每天在我们办公室里都有这样的交流活动: “伙计,我只是喜欢单元测试,我已经能够对某些工作方式进行大量更改,然后能够通过再次对它进行测试来确认我没有破坏任何东西……” 细节每天都在变化,但是情绪却没有变化。 单元测试和测试驱动的开发(TDD)具有许多隐藏的和个人的好处,以及显而易见的好处,您只是在他们自己做之前就无法真正向他人解释。 但是,忽略这一点,这是我的尝试! 单元测试使您可以快速地对代码进行重大更改。 您知道它现在可以正常运行,因为您已经运行了测试,在进行需要进行的更改时,需要使测试重新运行。 这样可以节省时间。 TDD可帮助您了解何时停止编码。 通过测试,您可以确信自己已经做了足够的工作
  • 最好的CSS框架是什么,值得付出努力吗?(What is the best CSS Framework and are they worth the effort?)
    问题 已锁定。 该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 在另一个论坛上阅读时,我遇到了CSS框架的世界。 我一直特别关注的是BluePrint。 我想知道是否还有其他人遇到过CSS框架,请​​问哪个是最好的,是否值得努力? 回答1 CSS“框架”完全没有意义。 CSS与JavaScript不同,您可以在CSS中包含基础库/框架,然后从中调用函数和对象来进行更高级别的工作。 所有CSS框架都可以为您提供声明性规则:一些默认的浏览器规则重置内容,一些类样式(必须强制向其编写页面)以及使用“ float”和“ clear”的布局规则。 您可以自己用几行CSS编写代码,而不必花一百个框架规则。 特别是“网格布局”的东西可以追溯到将演示文稿混合到标记中的糟糕年代。 'div class =“ span-24”'并不比表格好,您必须回到那里并更改标记以影响布局。 而且我所看到的所有框架都是基于固定像素的浮动框,因此无法创建可在各种窗口尺寸上访问的液体布局。 它是向后创作的,仅用于过于害怕编写CSS规则的人。 回答2 因此,到目前为止,还没有人回答这个问题(尽管我看到了一些反对意见),所以我将至少尝试解决此提示中的第二个问题。 CSS框架很棒; 与其他任何框架一样,它们减少了开发时间,使您可以立即进行针对特定地点的设计和CSS的工作。
  • 微优化值得吗?(Is micro-optimization worth the time?)
    问题 我是一名PHP开发人员,我一直认为微优化是不值得的。 如果您确实需要这种额外的性能,则可以编写软件以使其在体系结构上更快,或者编写C ++扩展来处理缓慢的任务(或者更好的方法是使用HipHop编译代码)。 但是今天有个同事告诉我 is_array($array) 和 $array === (array) $array 而且我就像“嗯,那确实是没有意义的比较”,但是他不同意我的看法。.他是我们公司中最好的开发人员,并且负责一个每天执行约5000万次SQL查询的网站- - 例如。 因此,我想知道的是:他可能是错的,还是微优化真的值得您花时间和时间? 回答1 当您有证据证明您正在优化瓶颈时,微优化是值得的。 通常这是不值得的-编写尽可能可读的代码,并使用实际的基准来检查性能。 如果发现瓶颈,则对那部分代码进行微优化(随需测量)。 有时,少量的微优化可能会产生巨大的变化。 但是不要对所有代码进行微优化……最终将很难维护,您很可能会发现您错过了真正的瓶颈,或者您的微优化正在损害性能,而不是损害性能。帮助。 回答2 好吧,对于一个很小的数组, $array === (array) $array比is_array($array)快得多。 速度提高了7倍以上。 但是每个呼叫仅约1.0 x 10 ^ -6秒( 0.000001 seconds )。 因此,除非您真的要成千上万次调用它
  • PyTorch internals
    PyTorch internals This post is a long form essay version of a talk about PyTorch internals, that I gave at the PyTorch NYC meetup on May 14, 2019. 这篇文章是我在2019年5月14日于PyTorch纽约市见面会上发表的有关PyTorch内部原理的长篇论文版本。 Hi everyone! Today I want to talk about the internals of PyTorch. This talk is for those of you who have used PyTorch, and thought to yourself, “It would be great if I could contribute to PyTorch,” but were scared by PyTorch’s behemoth of a C++ codebase. I’m not going to lie: the PyTorch codebase can be a bit overwhelming at times. The purpose of this talk is to put a map in your hands: to
  • 值得在析构函数中将指针设置为NULL吗?(Is it worth setting pointers to NULL in a destructor?)
    问题 想象一下,我有一个分配内存的类(暂时忘记智能指针): class Foo { public: Foo() : bar(new Bar) { } ~Foo() { delete bar; } void doSomething() { bar->doSomething(); } private: Bar* bar; }; 除了删除析构函数中的对象外,还值得将它们设置为NULL吗? 我假设在上述示例的析构函数中将指针设置为NULL会浪费时间。 回答1 由于析构函数是对象在“死亡”之前被调用的最后一件事,因此我想说事后无需将其设置为NULL 。 在任何其他情况下,我总是在对它调用delete之后将指针设置为NULL 。 回答2 有几个答案提到在DEBUG构建中执行此操作以帮助调试可能是值得的。 不要这样做。 您可能会潜在地帮助隐藏一个调试版本中的问题,而该问题并未隐藏在您实际提供给客户的发行版本中(这与您的调试版本应该具有的相反效果)。 如果要在dtor中“清除”指针,则最好使用其他习惯用法-将指针设置为已知的错误指针值。 这样,如果某个对象的悬空引用最终试图使用该指针,则将得到可诊断的崩溃,而不是因为避免使用指针而导致的错误代码,因为它注意到它为NULL。 假设doSomething()看起来像: void doSomething() { if (bar) bar-
  • 静态和非静态初始化代码块有什么区别(What is the difference between a static and a non-static initialization code block)
    问题 我的问题是关于static关键字的一种特殊用法。 可以使用static关键字覆盖不属于任何函数的类中的代码块。 例如,以下代码编译: public class Test { private static final int a; static { a = 5; doSomething(a); } private static int doSomething(int x) { return (x+5); } } 如果删除static关键字,则会抱怨,因为变量a是final 。 但是,可以同时删除final和static关键字并进行编译。 这两种方式都使我感到困惑。 我应该如何拥有不属于任何方法的代码段? 如何调用它? 通常,此用法的目的是什么? 或者更好的是,在哪里可以找到有关此文档的文档? 回答1 带有static修饰符的代码块表示一个类初始化程序。 没有静态修饰符的代码块是实例初始化程序。 在加载类时(实际上是在解决问题时,这是技术性的),类初始化器按照定义的顺序执行(自上而下,就像简单的变量初始化器一样)。 实例初始化程序按照实例化类时定义的顺序执行,紧接在执行构造函数代码之前,紧接在调用超级构造函数之后。 如果从int a删除static ,它将成为一个实例变量,您将无法从static初始值设定项块中访问它。 这将无法编译,并显示错误“无法从静态上下文中引用非静态变量a
  • At what point is it worth using a database?
    I have a question relating to databases and at what point is worth diving into one. I am primarily an embedded engineer, but I am writing an application using Qt to interface with our controller. We are at an odd point where we have enough data that it would be feasible to implement a database (around 700+ items and growing) to manage everything, but I am not sure it is worth the time right now to deal with. I have no problems implementing the GUI with files generated from excel and parsed in, but it gets tedious and hard to track even with VBA scripts. I have been playing around with
  • 多个Redis数据库的意义是什么?(What's the Point of Multiple Redis Databases?)
    问题 因此,我来​​到了一个地方,我想将存储在Redis中的数据分割到单独的数据库中,因为有时我需要对一种特定类型的数据使用keys命令,并希望将其分离以使其更快。 如果我细分为多个数据库,那么所有内容仍然都是单线程的,而我仍然只能使用一个内核。 如果我只是在同一盒子上启动另一个Redis实例,那么我将使用一个额外的内核。 最重要的是,我无法命名Redis数据库,也无法给它们提供任何更逻辑的标识符。 因此,话虽这么说,为什么/何时我要使用多个Redis数据库,而不是仅仅为我想要的每个额外数据库分配一个Redis额外实例? 与此相关的是,Redis为什么不尝试为我添加的每个额外数据库使用额外的内核? 跨数据库单线程的优势是什么? 回答1 原则上,同一实例上的Redis数据库与RDBMS数据库实例中的架构没有什么不同。 因此,话虽这么说,为什么/何时我要使用多个Redis数据库,而不是仅仅为我想要的每个额外数据库分配一个Redis额外实例? 在同一redis实例中使用redis数据库有一个明显的优势,那就是管理。 如果您为每个应用程序启动一个单独的实例,并且假设您有3个应用程序,那么这就是3个独立的redis实例,每个实例在生产中可能都需要从属HA实例,因此总共有6个实例。 从管理的角度来看,这很快就会变得混乱,因为您需要监视所有这些,进行升级/修补等。如果您不打算通过高I /
  • LEA指令的目的是什么?(What's the purpose of the LEA instruction?)
    问题 对我来说,这就像一部时髦的MOV。 它的目的是什么?何时使用? 回答1 正如其他人指出的那样,LEA(有效负载地址)通常被用作进行某些计算的“技巧”,但这并不是其主要目的。 x86指令集旨在支持Pascal和C等高级语言,在这些语言中,数组(尤其是int或小结构的数组)很常见。 例如,考虑一个表示(x,y)坐标的结构: struct Point { int xcoord; int ycoord; }; 现在想象一下一条语句: int y = points[i].ycoord; 其中points[]是Point的数组。 假设数组的基础已经在EBX ,并且变量i在EAX ,并且xcoord和ycoord均为32位(因此ycoord在struct中的偏移量为4个字节),则可以将该语句编译为: MOV EDX, [EBX + 8*EAX + 4] ; right side is "effective address" 这将土地y在EDX 。 比例因子8是因为每个Point大小为8个字节。 现在考虑与运算符&的“地址”一起使用的表达式: int *p = &points[i].ycoord; 在这种情况下,您不需要ycoord的值,但需要它的地址。 这就是LEA (加载有效地址)的来源。编译器可以生成MOV而不是MOV 。 LEA ESI, [EBX + 8*EAX + 4]
  • Kafka的Exactly-once语义与事务机制
    Kafka 0.11.x版本(对应 Confluent Platform 3.3),该版本引入了exactly-once语义。精确一次确实很难实现(Exactly-once is a really hard problem)Mathias Verraes说,分布式系统中最难解决的两个问题是:消息顺序保证(Guaranteed order of messages)。消息的精确一次投递(Exactly-once delivery)。消息系统语义概述(Overview of messaging system semantics)在一个分布式发布订阅消息系统中,组成系统的计算机总会由于各自的故障而不能工作。在Kafka中,一个单独的broker,可能会在生产者发送消息到一个topic的时候宕机,或者出现网络故障,从而导致生产者发送消息失败。根据生产者如何处理这样的失败,产生了不同的语义:至少一次语义(At least once semantics):如果生产者收到了Kafka broker的确认(acknowledgement,ack),并且生产者的acks配置项设置为all(或-1),这就意味着消息已经被精确一次写入Kafka topic了。然而,如果生产者接收ack超时或者收到了错误,它就会认为消息没有写入Kafka topic而尝试重新发送消息
  • 将图像存储在MongoDB数据库中(Store images in a MongoDB database)
    问题 如何将图像存储在MongoDB数据库中而不是仅存储文本中? 我可以在MongoDB数据库中创建图像数组吗? 视频是否可以做同样的事情? 回答1 请参阅GridFS文档以获取有关存储此类二进制数据的详细信息。 屏幕底部将链接对您特定语言的支持。 回答2 “您应该始终使用GridFS来存储大于16MB的文件”-我什么时候应该使用GridFS? MongoDB BSON文档的上限为16 MB。 因此,如果文件数组的总大小小于该大小,则可以使用BinData数据类型将它们直接存储在文档中。 视频,图像,PDF,电子表格等-没关系,它们都是一样的。 由您的应用程序决定是否返回适当的内容类型标头以显示它们。 请查看GridFS文档以获取更多详细信息。 回答3 您可以尝试以下一种方法: String newFileName = "my-image"; File imageFile = new File("/users/victor/images/image.png"); GridFS gfsPhoto = new GridFS(db, "photo"); GridFSInputFile gfsFile = gfsPhoto.createFile(imageFile); gfsFile.setFilename(newFileName); gfsFile.save(); 回答4 http:/
  • git gc --aggressive vs git repack(git gc --aggressive vs git repack)
    问题 我正在寻找减少git存储库大小的方法。 搜索将我引向git gc --aggressive大多数时候git gc --aggressive性的。 我也读过,这不是首选的方法。 为什么? 如果我正在运行gc --aggressive我应该知道gc --aggressive什么? git repack -a -d --depth=250 --window=250而不是gc --aggressive 。 为什么? repack如何减少存储库的大小? 另外,我对标志--depth和--window不太清楚。 我应该在gc和repack之间选择什么? 我什么时候应该使用gc并repack ? 回答1 如今,两者之间没有任何区别: git gc --aggressive根据Linus在2007年提出的建议进行操作; 见下文。 从2.11版(2016年第四季度)开始,git默认深度为50。大小为250的窗口是好的,因为它扫描每个对象的较大部分,但是深度为250的窗口是不好的,因为它使每个链都引用很深的旧的对象,这会减慢所有将来的git操作的速度,从而略微降低磁盘使用率。 历史背景 Linus建议使用git gc --aggressive (请参阅下面的完整邮件列表帖子)–仅当用他的话说“一个非常糟糕的背包”或“确实非常糟糕的三角洲”时使用git gc --aggressive ,但是
  • 使用Python的re.compile是否值得?(Is it worth using Python's re.compile?)
    问题 在Python中对正则表达式使用compile有什么好处? h = re.compile('hello') h.match('hello world') 与 re.match('hello', 'hello world') 回答1 与动态编译相比,我有1000多次运行已编译的正则表达式的经验,并且没有注意到任何可察觉的差异。 显然,这是轶事,当然也不是反对编译的一个很好的论据,但我发现两者之间的差别可以忽略不计。 编辑:快速浏览了实际的Python 2.5库代码后,我发现无论何时使用Python(包括对re.match()调用),Python都会在内部编译和缓存正则表达式,因此您实际上只是在更改正则表达式时编译,并且不应节省太多时间-只是节省检查缓存的时间(对内部dict类型的键查找)。 从模块re.py(评论是我的): def match(pattern, string, flags=0): return _compile(pattern, flags).match(string) def _compile(*key): # Does cache check at top of function cachekey = (type(key[0]),) + key p = _cache.get(cachekey) if p is not None: return p #
  • pmp值得考吗
    还是值得考的,平心而论,虽然我考试目的不纯,但是我是很认真的看完了那厚厚的一本书。如果不是因为考试,我可能无法耐下心来把那么一本书从头到尾看一遍,并且做了几百道题。然而,也是这个艰难的过程,让我对PMP的知识体系有了更深刻的认识。欢迎加入PMP备考资料交流群PMP证书一个很大的优势是不受行业限制,不论你是在金融,建筑,通信,IT,制造业等等领域,考取了之后基本都能受到企业的高度认可,企业中的项目 管理者,项目基本人员,或者是技术人员都是适用的。但如果你是从事IT行业的,就更建议你考一下这个证,PMP证书在IT行业是占比重最大的,比较注重项目的可操作性和实施性,属于项目型行业。在各种招聘网站上,你会经常看到“PMP优先”的字眼,在招聘市场上,越来越多的优秀企业在招聘的时候要求项目经理具有PMP证书。这说明PMP持证人士的专业性还是得到了认可。对于有过PMP培训经历的小伙伴,虽然不一定是经验丰富的项目经理,但是其对项目管理、对流程控制、对持续改进、对成本、风险控制都是有一定的认知。PMP证书可以说是踏入行业的第一步,值不值得考全看自己的需求,如果在学习PMP的过程中,学到的东西远远大于证书的意义,这是不是值得的呢?每次看到PMPBok那本厚厚的书,“厚积薄发”这个词就浮现在我的脑海,一个可靠,科学化的理论,可以指导你完成很多的工作,只有掌握了这些繁重的理论知识,才能在实际的工作中做到
  • Python中的“命名元组”是什么?(What are “named tuples” in Python?)
    问题 阅读Python 3.1中的更改​​,我发现了一些意外…… sys.version_info元组现在是一个命名的元组: 我以前从未听说过命名元组,并且我认为元素可以用数字(如在元组和列表中)或键(如字典中)进行索引。 我从没想到它们可以同时被索引。 因此,我的问题是: 什么叫元组? 如何使用它们? 为什么/何时应该使用命名元组而不是普通元组? 为什么/何时应该使用普通元组而不是命名元组? 是否存在某种“命名列表”(命名元组的可变版本)? 回答1 命名元组基本上是易于创建的轻量级对象类型。 可以使用类对象变量解引用或标准元组语法来引用已命名的元组实例。 除了它们是不可变的,它们可以类似地用于struct或其他常见记录类型。 它们是在Python 2.6和Python 3.0中添加的,尽管在Python 2.4中有实现的秘诀。 例如,通常将点表示为元组(x, y) 。 这将导致如下代码: pt1 = (1.0, 5.0) pt2 = (2.5, 1.5) from math import sqrt line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2) 使用命名的元组,它变得更具可读性: from collections import namedtuple Point = namedtuple('Point', 'x
  • 什么是智能指针,什么时候应该使用它?(What is a smart pointer and when should I use one?)
    问题 什么是智能指针,什么时候应该使用它? 回答1 更新 这个答案很旧,因此描述了当时什么是“好”,这是Boost库提供的智能指针。 从C ++ 11开始,标准库提供了足够的智能指针类型,因此您应该赞成使用std :: unique_ptr,std :: shared_ptr和std :: weak_ptr。 还有std :: auto_ptr。 它非常类似于作用域指针,不同之处在于它还具有“特殊”的危险能力,可被复制-还会意外地转移所有权。 它在C ++ 11中已弃用,在C ++ 17中已删除,因此您不应该使用它。 std::auto_ptr<MyObject> p1 (new MyObject()); std::auto_ptr<MyObject> p2 = p1; // Copy and transfer ownership. // p1 gets set to empty! p2->DoSomething(); // Works. p1->DoSomething(); // Oh oh. Hopefully raises some NULL pointer exception. 老答案 智能指针是包装“原始”(或“裸露”)C ++指针的类,用于管理所指向对象的生命周期。 没有单一的智能指针类型,但是它们都尝试以一种实用的方式抽象一个原始指针。 智能指针应该比原始指针更可取。
  • 什么是NullPointerException,我该如何解决?(What is a NullPointerException, and how do I fix it?)
    问题 这个问题的答案是社区的努力。 编辑现有答案以改善此职位。 它目前不接受新的答案或互动。 什么是Null Pointer异常( java.lang.NullPointerException ),是什么原因导致的? 可以使用哪些方法/工具确定原因,以阻止异常导致程序过早终止? 回答1 声明引用变量(即对象)时,实际上是在创建指向对象的指针。 考虑以下代码,您在其中声明基本类型为int的变量: int x; x = 10; 在此示例中,变量x是一个int ,Java会为您将其初始化为0 。 当您在第二行上分配值10时,您的值10被写入x所指的存储位置。 但是,当您尝试声明引用类型时,会发生一些不同的事情。 采取以下代码: Integer num; num = new Integer(10); 第一行声明了一个名为num的变量,但实际上尚未包含原始值。 相反,它包含一个指针(因为类型是Integer ,它是引用类型)。 由于您尚未说出要指向的内容,因此Java将其设置为null ,这意味着“我什么都没有指向”。 在第二行中, new关键字用于实例化(或创建) Integer类型的对象,并且将指针变量num分配给该Integer对象。 NullPointerException (NPE)在声明变量但未创建对象并将其分配给该变量,然后再尝试使用该变量的内容(称为dereferencing