Python 5000万+;数据行-CSV或MySQL

Python 5000万+;数据行-CSV或MySQL,python,mysql,database,optimization,csv,Python,Mysql,Database,Optimization,Csv,我有一个大约1GB的CSV文件,其中包含大约5000万行数据,我想知道是将其保存为CSV文件还是将其存储为某种形式的数据库更好。我对MySQL了解不多,也不知道为什么我应该使用它或其他数据库框架,而不是将它作为CSV文件。我基本上是用这个数据集进行广度优先的搜索,所以一旦我得到了初始的“种子”设置5000万,我就用它作为队列中的第一个值 谢谢,你是想一下子把所有的东西都吞进去吗?如果是这样的话,那么CSV可能是一条出路。它简单有效 如果您需要进行查找,那么可以对数据进行索引的东西(如MySQL)

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


谢谢,

你是想一下子把所有的东西都吞进去吗?如果是这样的话,那么CSV可能是一条出路。它简单有效


如果您需要进行查找,那么可以对数据进行索引的东西(如MySQL)会更好。

我想说,在CSV上使用数据库来查找如此大的结构化数据有很多好处,因此我建议您学习足够的知识来这样做。但是,根据您的描述,您可能希望签出非服务器/轻型数据库。比如SQLite,或者类似于JavaDB/Derby的东西。。。或者根据您的数据结构,使用非关系型(Nosql)数据库——显然,您需要一个支持某种类型python的数据库。

如果您想搜索某个图形(因为您提到了广度优先搜索),那么MongoDB之类的键值存储怎么样然后a可能会被证明是有用的。

从你之前的问题来看,它看起来像是你在针对facebook好友数据进行社交网络搜索;所以我假设你的数据是一组“a是B的朋友”语句,你在寻找两个人之间的最短连接

如果您有足够的内存,我建议您将csv文件解析为列表字典。看

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

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

  • 图形工具
  • python图
  • networkx
  • IGRAPHE

对于50M行,我也会注意性能。从数据库中读取这50万行可能比读取50万行文本并自己进行所有解析更快。这是一个CSV文件,所以解析应该是“微不足道的”。如果它是一个类似XML文件的东西,那么是的,我同意:编码的简单性将胜出@Greg Hewgill如果在CSV中读取的速度太慢,那么这当然是值得比较的,但我不认为MySQL会更快。无论哪种方式,都有东西正在从磁盘上获取数据。解析CSV不太可能比磁盘的读取头慢。事实上,您甚至可以通过压缩CSV来交换一些CPU以获得更好的有效吞吐量,从而获得性能改进。如果您要反复在MySQL中读取整个内容,可能会导致它比操作系统的IO缓存更有效地缓存在内存中,但同样,您需要进行测量以确保。@Laurence Gonsalves:当您进行任何查找时,数据库实际上比带索引的普通文件快得多。这样做的原因是(经典)数据库还通过使用来最小化磁盘操作。虽然这里的数据只有1GB,所以最好的方法是从一开始就将其全部加载到内存中。@THC4k我从来没有说过要使用带索引的文件。我说如果他想一次把所有东西都读入,就使用一个文件,在这种情况下,B-树没有任何优势,大约是每行21.5字节。田地是什么?请确认只有一种类型的数据记录。请解释“我基本上是在用这个数据集进行广度优先搜索,所以一旦我得到初始“种子”设置5000万,我就用它作为我队列中的第一个值。”“这取决于”你对数据做了什么。提供更多信息以获得更好/有用的答案。@John实际上,在我使用标签进行测试之前,它现在应该更小,直到我意识到我可以在MATLAB中对数据进行一些操作。我对这些数据所做的是,我有一个来自Twitter的1000个用户ID的列表,称为L1,还有一个副本称为L2。然后我使用L1创建一个社交图,从列表中选择一个用户,查找他的所有朋友,并将其添加到列表中。我对L1中的其他999个用户也这样做。然后从L1中删除1000个用户,并删除重复的用户,然后将其发送到L2,并删除重复的用户。然后用新的L1重复。谢谢你的帮助。好的,我会看看那些我认为我有足够的内存来存储它的文件,因为文件理想情况下无论如何都不会超过2GB,谢谢。我查看了SQLite,它可能会工作,如果不是其他人建议的,在RAM中使用它可能是可行的和更快的。@Eizardii,如果你有足够的内存来完成这项工作,一定要在内存中使用它