eric2013 发表于 2015-9-15 15:16:11

基于SPI Flash的FlashFS批量创建文件和写数据测试以及相关问题

1. 每次创建10个CSV文件,分别写入32字节数据。速度测试如下:
    (创建前挂载,10个文件都写完后卸载)
================================================
经过测试发现,随着数据大批量的写入,首次创建文件和后面创建的9个文件需要的时间越来越长




多次创建后发现速度剧增。

eric2013 发表于 2015-9-15 15:22:02

只挂载一次,后面不再重复挂载和卸载,发现首次创建的时间基本跟后面9次一致了,但是随着不断的写入,
打开时间还是不断增加。估计FlashFS每次创建新文件都有一个查询的过程,随着文件数的大量增加,查询时间也长了。

eric2013 发表于 2015-9-15 17:01:15

fout = fopen ("re.csv",   "a");   append方式坚决不可以用在SPI Flash上面,这样会造成写入耗时越来越长。



写到400次的时候,速度已经没法看了。

eric2013 发表于 2015-9-15 17:27:40

对同一个文件进行重复重写fout = fopen ("re.csv", "w"); 测试了1000次,速度较稳定,每次写1024字节。
打开速度还算稳定。没有进行重复的加载和卸载。



测试进行了重复的加载和卸载,跟上面的速度基本一样。

eric2013 发表于 2015-9-15 18:04:01

创建1000个文件,每次写64字节数据,测试结果如下,创建新文件的时间慢慢增加。




================================
重新写这1000个文件。



eric2013 发表于 2015-9-15 19:00:49

创建到4000个文件时,速度已经无法容忍了,每次64字节。

eric2013 发表于 2015-9-15 23:50:31

依次创建1000个文件,每次写数据1024字节,然后循环重写9次,一共是执行了10000次。

eric2013 发表于 2015-9-15 23:59:17

测试总结:
1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。
2. 创建的文件不要太多,最好不要超过1000个文件。文件越多访问速度也越慢。
3. 实际测试按照一页的倍数(256字节)进行写操作最好,这样基本没有文件碎片。
4. 不管创建的是多少文件,如果采用的是重复写已经创建的文件,打开文件的速度会一点点增加,
    最终趋于一个最大值,后基本不会再增加,而是变成小值后继续增加,如此循环,实际测试是这样的。
5. 挂载系统后,首次创建或者打开文件比较的耗时间,这点要注意。
6. 真正耗时间的不是读写文件耗时间,而是创建或者打开文件比较的耗时间。
=============================================================
a. 这么来说的话,实际使用SPI Flash的FlashFS时最好采用创建多个文件来做数据管理,但是创建
    的文件数最好不要太多,要不会造成访问速度极其慢。
b. 可以考虑删除文件然后重新创建文件进行数据记录,这样速度要快些。
    另外就是在文件打开的情况下,进行数据读写操作,记录了多条数据后再进行关闭文件,要不重新打开
   文件比较耗时间。只有关闭了文件,写的数据才会记录到SPI Flash里面。

eric2013 发表于 2015-9-17 09:12:58

实际测试还有一种非常实用的方法,而且很适合基于SPI Flash的FlashFS,可以挂载了文件系统以后,创建文件,创建后不要再关闭这个文件,然后使用
fwrite等函数写数据,写一次数据调用一次fflush即可。这样就不需要重复打开和关闭文件了,而且也不怕掉电问题。

myxiaonia 发表于 2015-9-17 14:27:36

finit初始化文件系统时,会有检索整个文件系统fat和fsinfo的过程,导致运行巨慢。。。

估计打开文件时也有这种问题,你可以跟踪到反汇编里面,看看到底是哪个代码段耗费了这么多时间

我就是这样发现finit的问题的

zhou_jinbao 发表于 2015-10-23 09:14:58

我在使用中还发现,随着文件的不断变大,搜索文件函数ffind时间也越来越长。

eric2013 发表于 2015-10-23 09:24:24

回 zhou_jinbao 的帖子

zhou_jinbao:我在使用中还发现,随着文件的不断变大,搜索文件函数ffind时间也越来越长。 (2015-10-23 09:14) images/back.gif

这个应该是他内部机制决定的,我现在的办法就是打开一个文件后不要关闭,通过函数
fwrite后,再fflush同步一下,这样数据就写入到SPI Flash,速度也很稳定了。

创建文件太多比较影响速度。

stillman 发表于 2017-7-18 18:54:10

我手上做的一个项目想要使用FLASHFS,问题是写入的数据量一大,文件系统就会莫名其妙的损坏,掉电后再上电,fcheck通不过,必须要重新格式化才行,百思不得解啊!!
我用的单片机是LPC1343,FLASH是W25X32;
高手可知道是啥原因?
ps: 不用FLASHFS, 直接操作FLASH 没有问题.

eric2013 发表于 2017-7-19 01:38:00

回 stillman 的帖子

stillman:我手上做的一个项目想要使用FLASHFS,问题是写入的数据量一大,文件系统就会莫名其妙的损坏,掉电后再上电,fcheck通不过,必须要重新格式化才行,百思不得解啊!!
我用的单片机是LPC1343,FLASH是W25X32;
高手可知道是啥原因?
ps: 不用FLASHFS, 直接操作FLASH 没有 .. (2017-07-18 18:54) images/back.gif

损坏倒是没有遇到过,主要是这个帖子里面说的速度慢的问题。

1604-9527 发表于 2018-9-6 17:06:25

请问,如果需要对同一个文件重复写入数据,不采用fopen (xxxxx, “a”)模式,可以怎么处理呢?

eric2013 发表于 2018-9-7 01:11:56

1604-9527 发表于 2018-9-6 17:06
请问,如果需要对同一个文件重复写入数据,不采用fopen (xxxxx, “a”)模式,可以怎么处理呢?

这样的话,最好可以记录一批数据后,创建个新的文件继续。

1604-9527 发表于 2018-9-7 20:32:58

eric2013 发表于 2018-9-7 01:11
这样的话,最好可以记录一批数据后,创建个新的文件继续。

感谢你的回复:handshake。
现在做的硬件是SPI FLASH,上位机把很多个 APP分段下发给设备,在设备上能手动选择app来更新。如果采用创建新的文件的方法,一个APP就需要很多个文件来保存数据了,感觉实用会不太方便。

eric2013 发表于 2018-9-8 02:06:56

1604-9527 发表于 2018-9-7 20:32
感谢你的回复。
现在做的硬件是SPI FLASH,上位机把很多个 APP分段下发给设备,在设备上能手动 ...

下发APP应该问题不大,可以实际测试下性能。

zhumx 发表于 2023-12-26 08:52:59

eric2013 发表于 2015-9-15 23:59
测试总结:
1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。
2....

硬汉哥,我现在也遇到文件重复以“w”模式打开次数多了后,打开速度变慢的现象。但是文件是保存参数用的,当参数变化后,只能以"w"模式打开文件重写,目前不太好变更文件名。有什么办法能改善这种情况吗?

eric2013 发表于 2023-12-26 15:03:24

zhumx 发表于 2023-12-26 08:52
硬汉哥,我现在也遇到文件重复以“w”模式打开次数多了后,打开速度变慢的现象。但是文件是保存参数用的 ...

不要求速度的话,就慢慢写即可。也可以整体缓冲些后写入。

zhumx 发表于 2023-12-28 10:04:52

eric2013 发表于 2015-9-15 23:59
测试总结:
1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。
2....

“1. 使用的时候切记不可以使用fopen (xxxxx, "w")模式,这样会造成文件的访问速度极其慢。”这句话是不是打错了,是不可以使用fopen (xxxxx, "a")模式“?
页: [1]
查看完整版本: 基于SPI Flash的FlashFS批量创建文件和写数据测试以及相关问题