Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 存储100000+;服务器上的CSV文本文件?_Sqlite_File_Storage_Scalability - Fatal编程技术网

Sqlite 存储100000+;服务器上的CSV文本文件?

Sqlite 存储100000+;服务器上的CSV文本文件?,sqlite,file,storage,scalability,Sqlite,File,Storage,Scalability,我们有一个应用程序,需要存储数千个相当小的CSV文件。100000+并且每年以同样的数量增长。每个文件包含大约20-80KB的车辆跟踪数据。每个数据集(或文件)代表一个车辆行程 我们目前正在将这些信息存储在SQL Server中,但数据库的大小变得有点笨拙,我们每次只需要访问一个文件(因此不需要批量查询它或以其他方式存储在关系数据库中)。由于插入或删除数据时重建或更新索引所需的时间,随着我们添加更多曲目,数据库的性能正在下降 我们正在考虑三种方案: 我们可以使用SQL的FILESTREAM特性将

我们有一个应用程序,需要存储数千个相当小的CSV文件。100000+并且每年以同样的数量增长。每个文件包含大约20-80KB的车辆跟踪数据。每个数据集(或文件)代表一个车辆行程

我们目前正在将这些信息存储在SQL Server中,但数据库的大小变得有点笨拙,我们每次只需要访问一个文件(因此不需要批量查询它或以其他方式存储在关系数据库中)。由于插入或删除数据时重建或更新索引所需的时间,随着我们添加更多曲目,数据库的性能正在下降

我们正在考虑三种方案:

  • 我们可以使用SQL的FILESTREAM特性将数据外部化到文件中,但是我以前没有使用过这个特性。Filestream仍然会导致每个数据库对象(blob)有一个物理文件吗

  • 或者,我们可以将文件单独存储在磁盘上。那里 3年多后可能会变成50万人。会 NTFS文件系统可以应付这个数量吗

  • 如果很多文件是问题,我们是否应该考虑将数据集/文件分组成一个小数据库(一个用户),以便每个用户?是否有像SQLite这样的轻量级数据库可以存储文件


    还有一点:数据是高度可压缩的。压缩这些文件只会将其缩小到原始大小的10%。如果可能的话,我希望利用压缩来最小化所用的磁盘空间和备份大小

    我有一些想法,这是非常主观的,因此你的里程数和其他读者的里程数可能会有所不同,但希望它仍能为你带来成功,即使其他人想提出不同的观点

    首先,我看到了包含太多文件的文件夹的性能问题。一个项目通过创建256个名为00,01,02的目录来解决这个问题。。。fd、fe、ff,其中每一个目录中还有256个具有相同命名约定的目录。这可能会将500000个文件划分到65536个目录中,每个目录中只会有几个文件——如果您使用一个好的散列/随机生成器将它们分散开来的话。此外,文件名很短,无法存储在数据库中,例如
    32/af/file xyz.csv
    。毫无疑问,有人会咬我的头,但我觉得一个目录中有10000个文件就足够了

    其次,10万个80kB的文件相当于8GB的数据,而这些数据现在实际上并不是很大——实际上是一个小的USB闪存驱动器——所以我认为任何关于压缩的论点都没有那么有效——存储是便宜的。但重要的是备份。如果你有500000个文件,你有很多“inode”需要遍历,我认为过去的统计数据是,许多备份产品每秒只能遍历50-100个“inode”——因此你将等待很长时间。根据您所能容忍的停机时间,让系统离线并从原始的块设备进行备份可能会更好—比如说100MB/s,您可以在80秒内备份8GB,我无法想象传统的基于文件的备份可以达到这一点。替代方案可能是允许快照的文件系统,然后您可以从快照进行备份。或者是一个镜像文件系统,它允许您拆分镜像,从一个拷贝备份,然后重新加入镜像


    正如我所说,这是非常主观的,我相信其他人也会有其他想法。

    我使用的是一种混合方法的应用程序,主要是因为我们希望我们的应用程序能够在免费版本的SQL Server中工作(在小型安装中)…而文件负载会让我们很快翻身。我们有大量的文件——数以千万计的大型安装

    我们考虑了与您列举的相同的场景,但我们最终决定使用一系列中等大小(2gb)的内存映射文件,其中包含作为不透明blob的潜在文件。然后,在数据库中,blob由blob id(未压缩blob的sha1散列)设置关键字,并具有容器文件id、偏移量、长度和未压缩长度的字段。blob引用表中还有一个“published”标志。因为散列忠实地表示内容,所以blob只写一次。修改后的文件会产生新的散列,并将它们写入blob存储中的新位置

    在我们的例子中,blob并不是始终如一的文本文件——事实上,它们是所有类型文件的块。大文件通过滚动散列函数分解为大约64k个块。我们尝试用lz4压缩来压缩每个blob(这是一种非常快速的压缩方式,并且在有效不可压缩的数据上很快中止)

    这种方法非常有效,但不是轻易推荐的。它可能会变得复杂。例如,面对已删除的内容整理容器文件。为此,我们选择使用稀疏文件,只告诉NTFS已删除blob的范围。事务性需求更加复杂


    所有的goopfordb-to-blob存储都是c#,并对内存映射文件进行了一些互操作。您的场景听起来很相似,但要求稍低。我猜想你可以在没有内存映射I/O并发症的情况下逃脱。

    <代码>数据库的性能在添加更多的轨道< /代码>时会降低,你考虑在数据库中添加适当的索引而不是切换到CSV文件吗?如果速度是主要问题,如果主要问题是磁盘空间(这在imho中并不常见),那么从db切换可能会对您有所帮助(尽管我怀疑影响会很大)。我不是SQL专家,但我认为在有数百万行的表上很难获得良好的插入性能(每个代表一个10000行CSV文件中的一行)。我们已经考虑过了,但是我们不确定为什么这些特定的数据项甚至需要