Skip to content

Commit

Permalink
perf: async read file (#3531)
Browse files Browse the repository at this point in the history
  • Loading branch information
c121914yu committed Jan 6, 2025
1 parent 2bf1fce commit 2066094
Show file tree
Hide file tree
Showing 7 changed files with 61 additions and 53 deletions.
3 changes: 2 additions & 1 deletion docSite/content/zh-cn/docs/development/upgrading/4818.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@ weight: 806
4. 优化 - Mongo 全文索引表分离。
5. 优化 - 知识库检索查询语句合并,同时减少查库数量。
6. 优化 - 文件编码检测,减少 CSV 文件乱码概率。
7. 修复 - HTML 文件上传,base64 图片无法自动转图片链接。
7. 优化 - 异步读取文件内容,减少进程阻塞。
8. 修复 - HTML 文件上传,base64 图片无法自动转图片链接。
32 changes: 17 additions & 15 deletions packages/plugins/register.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,24 +35,26 @@ export const list = [...staticPluginList, ...packagePluginList];

/* Get plugins */
export const getCommunityPlugins = () => {
return list.map<SystemPluginTemplateItemType>((name) => {
const config = require(`./src/${name}/template.json`);
return Promise.all(
list.map<Promise<SystemPluginTemplateItemType>>(async (name) => {
const config = (await import(`./src/${name}/template.json`))?.default;

const isFolder = list.find((item) => item.startsWith(`${name}/`));
const isFolder = list.find((item) => item.startsWith(`${name}/`));

const parentIdList = name.split('/').slice(0, -1);
const parentId =
parentIdList.length > 0 ? `${PluginSourceEnum.community}-${parentIdList.join('/')}` : null;
const parentIdList = name.split('/').slice(0, -1);
const parentId =
parentIdList.length > 0 ? `${PluginSourceEnum.community}-${parentIdList.join('/')}` : null;

return {
...config,
id: `${PluginSourceEnum.community}-${name}`,
isFolder,
parentId,
isActive: true,
isOfficial: true
};
});
return {
...config,
id: `${PluginSourceEnum.community}-${name}`,
isFolder,
parentId,
isActive: true,
isOfficial: true
};
})
);
};

export const getSystemPluginTemplates = () => {
Expand Down
3 changes: 1 addition & 2 deletions packages/service/common/file/read/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import type { ReadFileResponse } from '../../../worker/readFile/type';
import axios from 'axios';
import { addLog } from '../../system/log';
import { batchRun } from '@fastgpt/global/common/fn/utils';
import { addHours } from 'date-fns';
import { matchMdImgTextAndUpload } from '@fastgpt/global/common/string/markdown';

export type readRawTextByLocalFileParams = {
Expand All @@ -21,7 +20,7 @@ export const readRawTextByLocalFile = async (params: readRawTextByLocalFileParam

const extension = path?.split('.')?.pop()?.toLowerCase() || '';

const buffer = fs.readFileSync(path);
const buffer = await fs.promises.readFile(path);

const { rawText } = await readRawContentByFileBuffer({
extension,
Expand Down
16 changes: 9 additions & 7 deletions packages/service/worker/readFile/parseOffice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,15 @@ const parsePowerPoint = async ({
}

// Returning an array of all the xml contents read using fs.readFileSync
const xmlContentArray = files.map((file) => {
try {
return fs.readFileSync(`${decompressPath}/${file.path}`, encoding);
} catch (err) {
return fs.readFileSync(`${decompressPath}/${file.path}`, 'utf-8');
}
});
const xmlContentArray = await Promise.all(
files.map((file) => {
try {
return fs.promises.readFile(`${decompressPath}/${file.path}`, encoding);
} catch (err) {
return fs.promises.readFile(`${decompressPath}/${file.path}`, 'utf-8');
}
})
);

let responseArr: string[] = [];

Expand Down
24 changes: 12 additions & 12 deletions packages/templates/register.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,24 +12,24 @@ const getTemplateNameList = () => {
return fs.readdirSync(templatesPath) as string[];
};

const getFileTemplates = (): AppTemplateSchemaType[] => {
const getFileTemplates = async (): Promise<AppTemplateSchemaType[]> => {
const templateNames = getTemplateNameList();

const appMarketTemplates = templateNames.map((name) => {
const fileContent = require(`./src/${name}/template.json`);
return Promise.all(
templateNames.map<Promise<AppTemplateSchemaType>>(async (name) => {
const fileContent = (await import(`./src/${name}/template.json`))?.default;

return {
...fileContent,
templateId: `${PluginSourceEnum.community}-${name}`,
isActive: true
};
});

return appMarketTemplates;
return {
...fileContent,
templateId: `${PluginSourceEnum.community}-${name}`,
isActive: true
};
})
);
};

const getAppTemplates = async () => {
const communityTemplates = getFileTemplates();
const communityTemplates = await getFileTemplates();

const dbTemplates = await MongoAppTemplate.find();

Expand Down
32 changes: 17 additions & 15 deletions projects/app/src/service/common/system/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { initHttpAgent } from '@fastgpt/service/common/middle/httpAgent';
import { existsSync, readdirSync, readFileSync } from 'fs';
import fs, { existsSync, readdirSync } from 'fs';
import type { FastGPTFeConfigsType } from '@fastgpt/global/common/system/types/index.d';
import type { FastGPTConfigFileType } from '@fastgpt/global/common/system/types/index.d';
import { PluginSourceEnum } from '@fastgpt/global/core/plugin/constants';
Expand All @@ -13,7 +13,7 @@ import { defaultGroup, defaultTemplateTypes } from '@fastgpt/web/core/workflow/c
import { MongoPluginGroups } from '@fastgpt/service/core/app/plugin/pluginGroupSchema';
import { MongoTemplateTypes } from '@fastgpt/service/core/app/templates/templateTypeSchema';

export const readConfigData = (name: string) => {
export const readConfigData = async (name: string) => {
const splitName = name.split('.');
const devName = `${splitName[0]}.local.${splitName[1]}`;

Expand All @@ -30,7 +30,7 @@ export const readConfigData = (name: string) => {
return `/app/data/${name}`;
})();

const content = readFileSync(filename, 'utf-8');
const content = await fs.promises.readFile(filename, 'utf-8');

return content;
};
Expand Down Expand Up @@ -120,13 +120,13 @@ export async function initSystemConfig() {
});
}

function getSystemVersion() {
async function getSystemVersion() {
if (global.systemVersion) return;
try {
if (process.env.NODE_ENV === 'development') {
global.systemVersion = process.env.npm_package_version || '0.0.0';
} else {
const packageJson = json5.parse(readFileSync('/app/package.json', 'utf-8'));
const packageJson = json5.parse(await fs.promises.readFile('/app/package.json', 'utf-8'));

global.systemVersion = packageJson?.version;
}
Expand All @@ -138,7 +138,7 @@ function getSystemVersion() {
}
}

function getSystemPlugin() {
async function getSystemPlugin() {
if (global.communityPlugins && global.communityPlugins.length > 0) return;

const basePath =
Expand All @@ -149,15 +149,17 @@ function getSystemPlugin() {
const filterFiles = files.filter((item) => item.endsWith('.json'));

// read json file
const fileTemplates = filterFiles.map<SystemPluginTemplateItemType>((filename) => {
const content = readFileSync(`${basePath}/${filename}`, 'utf-8');
return {
...json5.parse(content),
originCost: 0,
currentCost: 0,
id: `${PluginSourceEnum.community}-${filename.replace('.json', '')}`
};
});
const fileTemplates = await Promise.all(
filterFiles.map<Promise<SystemPluginTemplateItemType>>(async (filename) => {
const content = await fs.promises.readFile(`${basePath}/${filename}`, 'utf-8');
return {
...json5.parse(content),
originCost: 0,
currentCost: 0,
id: `${PluginSourceEnum.community}-${filename.replace('.json', '')}`
};
})
);

fileTemplates.sort((a, b) => (b.weight || 0) - (a.weight || 0));

Expand Down
4 changes: 3 additions & 1 deletion projects/app/src/service/core/app/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ export const getSystemPlugins = async (refresh = false) => {
global.systemPlugins = [];
}

global.systemPlugins = FastGPTProUrl ? await getCommercialPlugins() : getCommunityPlugins();
global.systemPlugins = FastGPTProUrl
? await getCommercialPlugins()
: await getCommunityPlugins();

addLog.info(`Load system plugin successfully: ${global.systemPlugins.length}`);

Expand Down

0 comments on commit 2066094

Please sign in to comment.