MySQL 与许多平面文件和 HDD 利用率的优化

Mic*_*cah 2 mysql optimization perl text

我想运行一个机器学习算法作为我的最终研究代码,该代码迄今为止尚未经过验证且未发布用于文本挖掘目的。文本已经获得,但是是从 Common Crawl 获得的 warc 格式中刮取的。我正在为机器学习目的准备数据,所需的分析任务之一是在启动 ML 应用程序之前对语料库进行 IDF(逆文档频率分析)。

据我了解,为了让 IDF 发挥作用,每个文件应该代表一个发言者或一个想法——通常是一小段 ASCII 文本,不比一条推文长多少。挑战在于我已经抓取了大约 1500 万个文件。我在 Windows 7 上使用 Strawberry Perl 读取每个文件并拆分文档中包含的标签,以便来自相关社交媒体的每个评论落入数组的一个元素中(并且在更强类型的语言中将是字符串类型)。

从这里我遇到了性能问题。我让我的脚本运行一整天,但它在 24 小时内只处理了 400,000 个输入文件。从这些输入文件中,它生成了大约 200 万个输出文件,代表每个说话者使用 Perl 的 HTML::Strip 模块处理 html 剥离文本的一个文件。当我查看我的系统时,我发现本地数据驱动器上的磁盘利用率非常高 - 有大量 ASCII 文本写入,远小于 1 KB,每个写入都被塞进本地数据驱动器的 1 KB 扇区中NTFS 格式的硬盘。

是否值得尝试停止运行,在我的家庭系统上设置一个 MySQL 数据库,在数据库中设置一个最大长度可能为 500-1000 个字符的文本字段,然后重新运行 perl 脚本以使其吸收输入html 文件,分割它,HTML 剥离它,然后准备并执行字符串插入与数据库表?

一般来说,从包含大量单独文本文件的文件输出格式切换到包含大量数据库插入的格式在我的硬盘驱动器上会更容易/从长远来看由于某些缓存或更快的写出速度DBMS 中的 RAM/磁盘空间利用魔法?

amo*_*mon 5

文件系统可以被解释为分层键值存储,并且它经常被 Unix-ish 程序使用。但是,创建文件可能会比较昂贵,具体取决于您使用的操作系统和文件系统。特别是,不同的文件系统在访问时间随一个目录中的文件数量变化的情况上存在显着差异。例如,请参阅NTFS 性能和大量文件和目录以及如何处理大量小文件?: \xe2\x80\x9c 目录中存在 10,000 个文件后,NTFS 性能会严重下降。\xe2\x80\x9d

\n\n

因此,从使用数百万个小文件的伪数据库迁移到 \xe2\x80\x9creal\xe2\x80\x9d 数据库(例如将数据存储在单个文件中的 SQLite),您可能会看到显着的好处,从而可以访问单个文件唱片更便宜。

\n\n

另一方面,200 万条记录并不算多,这表明文件系统开销可能不是您的限制因素。考虑在测试工作负载下运行您的软件,并使用分析器或其他调试工具来查看时间花在哪里。真的open()需要这么多时间吗?或者还有其他昂贵的处理可以优化吗?如果有一个可以并行化的预处理步骤,那么仅此一项就可以显着地缩短处理时间。

\n