const express = require('express'); const path = require('path'); const fs = require('fs'); const { exec } = require('child_process'); const LargeFileHandler = require('./src/largeFile'); const xmlJsonHandler = require('./src/xmlJson'); const performanceMonitor = require('./src/performance'); const CoreApiDemo = require('./src/coreApiDemo'); const app = express(); const PORT = 7860; const DATA_DIR = path.join(__dirname, 'data'); // Ensure data directory exists if (!fs.existsSync(DATA_DIR)) { fs.mkdirSync(DATA_DIR); } const LARGE_FILE_PATH = path.join(DATA_DIR, 'large_data.csv'); const XML_FILE_PATH = path.join(DATA_DIR, 'data.xml'); const LARGE_JSON_PATH = path.join(DATA_DIR, 'large_data.json'); // Global lock to prevent concurrent demos global.isDemoRunning = false; // Feature 1: Large File Stream async function runLargeFileDemo() { console.log('=== 1. 大文件流式处理演示 ==='); try { const largeFileHandler = new LargeFileHandler(LARGE_FILE_PATH); const lineCount = 100000; console.log(`正在生成测试数据 (${lineCount} 行)...`); await largeFileHandler.generateTestFile(lineCount); console.log('开始流式处理...'); await largeFileHandler.processFileStream(); logMemoryUsage(); } catch (err) { console.error('发生错误:', err); } } // Feature 2: XML Processing async function runXmlDemo() { console.log('=== 2. XML 处理演示 ==='); try { const xmlContent = xmlJsonHandler.generateXml(1000); fs.writeFileSync(XML_FILE_PATH, xmlContent); console.log(`XML 文件已保存: ${XML_FILE_PATH}`); const parsedXml = xmlJsonHandler.parseXml(xmlContent); console.log('XML 解析完成'); logMemoryUsage(); } catch (err) { console.error('发生错误:', err); } } // Feature 3: JSON Stream async function runJsonDemo() { console.log('=== 3. JSON 大文件流式处理演示 ==='); try { console.log('正在生成 JSON 数据...'); await xmlJsonHandler.generateLargeJson(LARGE_JSON_PATH, 10000); console.log('开始流式解析 JSON...'); await xmlJsonHandler.processLargeJsonStream(LARGE_JSON_PATH); logMemoryUsage(); } catch (err) { console.error('发生错误:', err); } } // Feature 4: Core APIs Demo async function runCoreApiDemo() { const coreDemo = new CoreApiDemo(DATA_DIR); await coreDemo.run(); } function logMemoryUsage() { const used = process.memoryUsage(); console.log('Memory Usage:'); for (let key in used) { console.log(`${key}: ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`); } } // Serve the main page app.get('/', (req, res) => { res.send(`