在驱动器上存储数据的最有效方法

时间:2013-10-23 03:18:24

标签: python sqlite csv

基线 - 我有包含10,000个条目的CSV数据。我将其保存为1个csv文件并立即加载它。

替代方案 - 我有包含10,000个条目的CSV数据。我将其保存为10,000个CSV文件并单独加载。

计算上大约多少效率低下。我对记忆问题并不十分感兴趣。替代方法的目的是因为我经常需要访问数据的子集,并且不希望必须读取整个数组。

我正在使用python。

编辑:如果需要,我可以使用其他文件格式。

Edit1:SQLite获胜。与我以前的工作相比,简单而有效。

3 个答案:

答案 0 :(得分:6)

SQLite是您应用的理想解决方案。

只需将您的CSV文件导入SQLite数据库表(它将是单个文件),然后根据需要添加索引。

要访问您的数据,请使用python sqlite3库。您可以使用this tutorial了解如何使用它。

与许多其他解决方案相比,SQLite将是在本地选择部分数据集的最快方式 - 当然要比访问10000个文件快得多。另请阅读this answer,其中解释了为什么SQLite如此优秀。

答案 1 :(得分:1)

我会将所有行写入一个文件。对于10,000行,它可能不值得,但你可以将所有行填充到相同的长度 - 比如1000字节。

然后很容易seek到第n行,只需将n乘以行长

答案 2 :(得分:0)

10,000个文件的加载和访问速度比一个文件慢,只是因为文件的数据可能会碎片化在磁盘驱动器周围,因此访问它将需要比访问内容更多的搜索量单个文件,通常按顺序存储。寻道时间是旋转介质的一个大幅减速,因为你的程序必须等待驱动器磁头在物理上重新定位,这可能需要几毫秒。 (缓慢的搜索时间对于SSD来说不是问题,但即便如此,仍然会有10,000文件的元数据开销,以便操作系统处理)。同样使用单个文件,操作系统可以通过预读缓冲为您加速(因为它可以合理地假设如果您阅读文件的一部分,您可能希望很快阅读下一部分)。对于多个文件,操作系统无法做到这一点。

我的建议(如果您不想使用SQLite路由)将使用单个CSV文件,并且(如果可能)将CSV文件的所有行用空格填充,以便它们都具有相同的长度。例如,假设您确保在写出CSV文件时使文件中的所有行正好长达80个字节。然后读取文件的第(n)行变得相对快速和简单:

myFileObject.seek(n*80)
theLine = myFileObject.read(80)