【问题标题】:50 million+ Rows of Data - CSV or MySQL超过 5000 万行数据 - CSV 或 MySQL
【发布时间】:2011-05-29 03:46:15
【问题描述】:

我有一个大约 1GB 大的 CSV 文件,包含大约 5000 万行数据,我想知道将其保存为 CSV 文件还是将其存储为某种形式的数据库更好。我对 MySQL 了解不多,无法争论为什么我应该使用它或其他数据库框架,而不是将其保存为 CSV 文件。我基本上是在使用这个数据集进行广度优先搜索,所以一旦我获得了初始的“种子”设置 5000 万,我将其用作队列中的第一个值。

谢谢,

【问题讨论】:

  • 每行大约 21.5 个字节。有哪些领域?请确认只有一种类型的数据记录。请解释一下“”“我基本上是在用这个数据集做一个广度优先搜索,所以一旦我得到了最初的“种子”设置 5000 万,我就用它作为我队列中的第一个值。“”“
  • “这取决于”您对数据的处理方式。提供更多信息以获得更好/有用的答案。
  • @John 实际上它现在应该更小了,因为在我使用标签进行测试之前,直到我意识到我可以在 MATLAB 中对数据进行一些操作。我对数据所做的事情是,我已经从 Twitter 列出了 1000 个用户 ID 的列表,称为 L1,它的副本称为 L2。然后我使用 L1 创建一个社交图谱,从该列表中获取一个用户,查找他的所有朋友,并将其附加到列表中。我对 L1 中的其他 999 个用户也这样做。然后从 L1 中删除 1000 个用户和重复项,然后将它们发送到 L2,并删除重复项。然后用新的 L1 重复。感谢您的帮助。

标签: python mysql database optimization csv


【解决方案1】:

我会说,使用数据库而不是 CSV 来处理如此庞大的结构化数据有很多好处,所以我建议您学习足够的知识来这样做。但是,根据您的描述,您可能需要查看非服务器/轻量级数据库。例如 SQLite,或类似于 JavaDB/Derby 的东西......或者根据您的数据结构,一个非关系 (Nosql) 数据库 - 显然您需要一个具有某种类型的 python 支持的数据库。

【讨论】:

  • 我研究了 SQLite 它可能会工作,如果不是其他人建议的可能是可行的,并且在 RAM 中使用它可能更快。
  • @eWizardII,如果你有足够的内存来完成这项工作肯定在内存中使用它
【解决方案2】:

如果您想搜索图形化的内容(因为您提到了广度优先搜索),那么 graph database 可能会很有用。

【讨论】:

    【解决方案3】:

    你是不是要一口气吃完所有东西?如果是这样,那么 CSV 可能是要走的路。这很简单而且很有效。

    如果您需要进行查找,那么可以为数据建立索引的工具(例如 MySQL)会更好。

    【讨论】:

    • 50M 行,我也会关注性能。从数据库中读取这 50M,而不是读取 50M 文本行并自己进行所有解析可能会更快。
    • 这是一个 CSV 文件,所以解析应该是“微不足道的”。如果它是类似于 XML 文件的东西,那么是的,我会同意:编码简单会胜出!
    • @Greg Hewgill 如果在 CSV 中读取速度太慢,当然应该进行比较,但我不认为 MySQL 会更快。无论哪种方式,都会从磁盘上获取数据。解析 CSV 不太可能比磁盘的读取头慢。事实上,您甚至可以通过压缩 CSV 以换取一些 CPU 以获得更好的有效吞吐量,从而提高性能。如果您要反复读取 MySQL 中的整个内容,可能会导致它比操作系统的 IO 缓存更有效地缓存在内存中,但同样,您需要进行测量以确保。
    • @Laurence Gonsalves:当您进行任何查找时,数据库实际上比具有索引的普通文件快得多。原因是(经典)数据库还通过使用B+ trees 来最小化磁盘操作。虽然这里的数据只有 1GB,所以最好的方法是从一开始就将它们全部加载到内存中。
    • @THC4k 我从未说过要使用带索引的文件。我说如果他要一次吞下所有东西,就使用文件,在这种情况下,B-tree 没有任何优势。
    【解决方案4】:

    从您之前的问题来看,您似乎正在对 Facebook 好友数据进行社交网络搜索;所以我假设您的数据是一组“A 是 B 的朋友”语句,并且您正在寻找两个人之间的最短连接?

    如果您有足够的内存,我建议您将 csv 文件解析为列表字典。见Can this breadth-first search be made faster?

    如果您不能一次保存所有数据,那么像 SQLite 这样的本地存储数据库可能是您的下一个最佳选择。

    还有一些 python 模块可能会有所帮助:

    【讨论】:

    • 好的,我会看看那些我认为我有足够的 RAM 来存储它的那些,因为理想情况下文件不会超过 2GB,谢谢。
    【解决方案5】:

    像 MongoDB 这样的键值存储怎么样

    【讨论】:

      猜你喜欢
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      • 2015-03-27
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 2020-11-23
      相关资源
      最近更新 更多