JavaScriptã€ãã¬ãŒã¿ãã«ããŒãããã³ã°ãšã³ãžã³ãæ§ç¯ãããããåŠçãæé©åããããã©ãŒãã³ã¹ãåäžãããã¢ããªã±ãŒã·ã§ã³ã®ã¹ã±ãŒã©ããªãã£ãé«ããæ¹æ³ãæ¢ããŸãã
JavaScript ã€ãã¬ãŒã¿ãã«ããŒãããã³ã°ãšã³ãžã³ïŒã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ã®ããã®ãããåŠçã®æé©å
çŸä»£ã®ã¢ããªã±ãŒã·ã§ã³éçºãç¹ã«å€§èŠæš¡ãªããŒã¿ã»ãããæ±ã£ãããèšç®è² è·ã®é«ãã¿ã¹ã¯ãå®è¡ãããããå Žåãå¹ççãªãããåŠçã¯éåžžã«éèŠã§ããããã§JavaScriptã€ãã¬ãŒã¿ãã«ããŒãããã³ã°ãšã³ãžã³ã圹ç«ã¡ãŸãããã®èšäºã§ã¯ããã®ãããªãšã³ãžã³ã®æŠå¿µãå®è£ ãå©ç¹ãæ¢ããå ç¢ã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ç¥èãæäŸããŸãã
ãããåŠçãšã¯äœãïŒ
ãããåŠçã¯ã倧ããªã¿ã¹ã¯ãããå°ããã管çãããããããã«åå²ããããšãå«ã¿ãŸãããããã®ãããã¯ãé æ¬¡ãŸãã¯äžŠè¡ããŠåŠçãããå¹çãšãªãœãŒã¹å©çšçãåäžãããŸããããã¯ãç¹ã«æ¬¡ã®ãããªå Žåã«åœ¹ç«ã¡ãŸãïŒ
- å€§èŠæš¡ããŒã¿ã»ããïŒ ããŒã¿ããŒã¹ããæ°çŸäžã®ã¬ã³ãŒããåŠçããã
- APIãªã¯ãšã¹ãïŒ ã¬ãŒãå¶éãé¿ããããã«è€æ°ã®APIãªã¯ãšã¹ããéä¿¡ããã
- ç»å/åç»åŠçïŒ è€æ°ã®ãã¡ã€ã«ã䞊è¡ããŠåŠçããã
- ããã¯ã°ã©ãŠã³ããžã§ãïŒ å³æã®ãŠãŒã¶ãŒãã£ãŒãããã¯ãå¿ èŠãšããªãã¿ã¹ã¯ãåŠçããã
ãªãã€ãã¬ãŒã¿ãã«ããŒãããã³ã°ãšã³ãžã³ã䜿çšããã®ãïŒ
JavaScriptã€ãã¬ãŒã¿ãã«ããŒãããã³ã°ãšã³ãžã³ã¯ããããåŠçãå®è£ ããããã®æ§é åãããå¹ççãªæ¹æ³ãæäŸããŸãããã®å©ç¹ã¯æ¬¡ã®ãšããã§ãïŒ
- ããã©ãŒãã³ã¹ã®æé©åïŒ ããŒã¿ããããã§åŠçããããšã§ãåã ã®æäœã«é¢é£ãããªãŒããŒããããåæžã§ããŸãã
- ã¹ã±ãŒã©ããªãã£ïŒ ãããåŠçã«ããããªãœãŒã¹ã®å²ãåœãŠãšäžŠè¡åŠçãåäžããã¢ããªã±ãŒã·ã§ã³ã®ã¹ã±ãŒã©ããªãã£ãé«ãŸããŸãã
- ãšã©ãŒãã³ããªã³ã°ïŒ åãããå ã®ãšã©ãŒã管çããã³åŠçãããããªããŸãã
- ã¬ãŒãå¶éã®éµå®ïŒ APIãšå¯Ÿè©±ããéããããåŠçã¯ã¬ãŒãå¶éã®éµå®ã«åœ¹ç«ã¡ãŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäžïŒ è² è·ã®é«ãã¿ã¹ã¯ãããã¯ã°ã©ãŠã³ãããã»ã¹ã«ãªãããŒãããããšã§ãã¡ã€ã³ã¹ã¬ãããå¿çæ§ãä¿ã¡ãããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªãããŸãã
ã³ã¢ã³ã³ã»ãã
1. ã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿
ã€ãã¬ãŒã¿ã¯ãã·ãŒã±ã³ã¹ãšããã®çµäºæã«è¿ãããå€ãå®çŸ©ãããªããžã§ã¯ãã§ããJavaScriptã§ã¯ããªããžã§ã¯ãã2ã€ã®ããããã£ãæã€ãªããžã§ã¯ããè¿ãnext()
ã¡ãœãããå®è£
ããŠããå Žåããã®ãªããžã§ã¯ãã¯ã€ãã¬ãŒã¿ã§ãïŒ
value
ïŒ ã·ãŒã±ã³ã¹ã®æ¬¡ã®å€ãdone
ïŒ ã·ãŒã±ã³ã¹ãçµäºãããã©ããã瀺ãããŒã«å€ã
ãžã§ãã¬ãŒã¿ã¯ãäžæåæ¢ããã³åéã§ãã颿°ã§ãããã€ãã¬ãŒã¿ãããç°¡åã«å®çŸ©ã§ããŸããyield
ããŒã¯ãŒãã䜿çšããŠå€ãçæããŸãã
function* numberGenerator(max) {
let i = 0;
while (i < max) {
yield i++;
}
}
const iterator = numberGenerator(5);
console.log(iterator.next()); // Output: { value: 0, done: false }
console.log(iterator.next()); // Output: { value: 1, done: false }
console.log(iterator.next()); // Output: { value: 2, done: false }
console.log(iterator.next()); // Output: { value: 3, done: false }
console.log(iterator.next()); // Output: { value: 4, done: false }
console.log(iterator.next()); // Output: { value: undefined, done: true }
2. éåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿
éåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã¯ãã€ãã¬ãŒã¿ãããã³ã«ãæ¡åŒµããŠéåææäœãåŠçããŸãããããã¯await
ããŒã¯ãŒãã䜿çšãããããã¹ãè¿ããŸãã
async function* asyncNumberGenerator(max) {
let i = 0;
while (i < max) {
await new Promise(resolve => setTimeout(resolve, 100)); // Simulate async operation
yield i++;
}
}
async function consumeAsyncIterator() {
const iterator = asyncNumberGenerator(5);
let result = await iterator.next();
while (!result.done) {
console.log(result.value);
result = await iterator.next();
}
}
consumeAsyncIterator();
3. ãããã³ã°ããžãã¯
ãããã³ã°ã¯ãã€ãã¬ãŒã¿ããã¢ã€ãã ãåéããŠãããã«ãŸãšããããããäžç·ã«åŠçããããšãå«ã¿ãŸããããã¯ããã¥ãŒãŸãã¯é åã䜿çšããŠå®çŸã§ããŸãã
åºæ¬çãªåæãããã³ã°ãšã³ãžã³ã®æ§ç¯
ãŸããåçŽãªåæãããã³ã°ãšã³ãžã³ããå§ããŸãããïŒ
function batchIterator(iterator, batchSize) {
return {
next() {
const batch = [];
for (let i = 0; i < batchSize; i++) {
const result = iterator.next();
if (result.done) {
if (batch.length > 0) {
return { value: batch, done: false };
} else {
return { value: undefined, done: true };
}
}
batch.push(result.value);
}
return { value: batch, done: false };
}
};
}
// Example usage:
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const numberIterator = numbers[Symbol.iterator]();
const batchedIterator = batchIterator(numberIterator, 3);
let batchResult = batchedIterator.next();
while (!batchResult.done) {
console.log('Batch:', batchResult.value);
batchResult = batchedIterator.next();
}
ãã®ã³ãŒãã¯ãã€ãã¬ãŒã¿ãšããããµã€ãºãå
¥åãšããŠåãåãbatchIterator
颿°ãå®çŸ©ããŸããããã¯ãå
ã®ã€ãã¬ãŒã¿ããã¢ã€ãã ã®ããããçæããæ°ããã€ãã¬ãŒã¿ãè¿ããŸãã
éåæãããã³ã°ãšã³ãžã³ã®æ§ç¯
éåææäœã«ã¯ãéåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã䜿çšããå¿ èŠããããŸãã以äžã«äŸã瀺ããŸãïŒ
async function* asyncBatchIterator(asyncIterator, batchSize) {
let batch = [];
for await (const item of asyncIterator) {
batch.push(item);
if (batch.length === batchSize) {
yield batch;
batch = [];
}
}
if (batch.length > 0) {
yield batch;
}
}
// Example Usage:
async function* generateAsyncNumbers(max) {
for (let i = 0; i < max; i++) {
await new Promise(resolve => setTimeout(resolve, 50)); // Simulate async operation
yield i;
}
}
async function processBatches() {
const asyncNumberGeneratorInstance = generateAsyncNumbers(15);
const batchedAsyncIterator = asyncBatchIterator(asyncNumberGeneratorInstance, 4);
for await (const batch of batchedAsyncIterator) {
console.log('Async Batch:', batch);
}
}
processBatches();
ãã®ã³ãŒãã¯ãéåæã€ãã¬ãŒã¿ãšããããµã€ãºãåãåãasyncBatchIterator
颿°ãå®çŸ©ããŸããããã¯ãå
ã®éåæã€ãã¬ãŒã¿ããã¢ã€ãã ã®ããããçæããéåæã€ãã¬ãŒã¿ãè¿ããŸãã
é«åºŠãªæ©èœãšæé©å
1. 䞊è¡åŠçå¶åŸ¡
ããã©ãŒãã³ã¹ãããã«åäžãããããã«ããããã䞊è¡ããŠåŠçã§ããŸããããã¯ãPromise.all
ã®ãããªãã¯ããã¯ãå°çšã®ã¯ãŒã«ããŒã«ã䜿çšããŠå®çŸã§ããŸãã
async function processBatchesConcurrently(asyncIterator, batchSize, concurrency) {
const batchedAsyncIterator = asyncBatchIterator(asyncIterator, batchSize);
const workers = Array(concurrency).fill(null).map(async () => {
for await (const batch of batchedAsyncIterator) {
// Process the batch concurrently
await processBatch(batch);
}
});
await Promise.all(workers);
}
async function processBatch(batch) {
// Simulate batch processing
await new Promise(resolve => setTimeout(resolve, 200));
console.log('Processed batch:', batch);
}
2. ãšã©ãŒãã³ããªã³ã°ãšãªãã©ã€ããžãã¯
å ç¢ãªãšã©ãŒãã³ããªã³ã°ã¯äžå¯æ¬ ã§ãã倱æãããããã«å¯ŸããŠãªãã©ã€ããžãã¯ãå®è£ ãããããã°ã®ããã«ãšã©ãŒããã°ã«èšé²ããŸãã
async function processBatchWithRetry(batch, maxRetries = 3) {
let retries = 0;
while (retries < maxRetries) {
try {
await processBatch(batch);
return;
} catch (error) {
console.error(`Error processing batch (retry ${retries + 1}):`, error);
retries++;
await new Promise(resolve => setTimeout(resolve, 1000)); // Wait before retrying
}
}
console.error('Failed to process batch after multiple retries:', batch);
}
3. ããã¯ãã¬ãã·ã£ãŒãã³ããªã³ã°
åŠçé床ãããŒã¿çæé床ãããé ãå Žåã«ã·ã¹ãã ãéè² è·ã«ãªãã®ãé²ãããã«ãããã¯ãã¬ãã·ã£ãŒã¡ã«ããºã ãå®è£ ããŸããããã«ã¯ãã€ãã¬ãŒã¿ãäžæåæ¢ãããããµã€ãºãå¶éããããã¥ãŒã䜿çšãããããããšãå«ãŸããŸãã
4. åçããããµã€ãžã³ã°
ã·ã¹ãã ã®è² è·ãåŠçæéã«åºã¥ããŠããããµã€ãºãåçã«èª¿æŽããããã©ãŒãã³ã¹ãæé©åããŸãã
å®äžçã§ã®äŸ
1. å€§èŠæš¡ãªCSVãã¡ã€ã«ã®åŠç
顧客ããŒã¿ãå«ãå€§èŠæš¡ãªCSVãã¡ã€ã«ãåŠçããå¿ èŠããããšæ³åããŠãã ããããããã³ã°ãšã³ãžã³ã䜿çšããŠãã¡ã€ã«ããã£ã³ã¯ã§èªã¿åããåãã£ã³ã¯ã䞊è¡ããŠåŠçããçµæãããŒã¿ããŒã¹ã«ä¿åã§ããŸããããã¯ãã¡ã¢ãªã«åãŸããããªãã»ã©å€§ããªãã¡ã€ã«ãæ±ãå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
2. APIãªã¯ãšã¹ãã®ãããåŠç
ã¬ãŒãå¶éã®ããAPIãšå¯Ÿè©±ããå Žåããªã¯ãšã¹ãããããåŠçããããšã§ãã¹ã«ãŒããããæå€§åãã€ã€å¶éå ã«çãŸãã®ã«åœ¹ç«ã¡ãŸããããšãã°ãTwitter APIã䜿çšããå Žåãè€æ°ã®ãã€ãŒãäœæãªã¯ãšã¹ãã1ã€ã®ãããã«ãŸãšããäžç·ã«éä¿¡ã§ããŸãã
3. ç»ååŠçãã€ãã©ã€ã³
ç»ååŠçãã€ãã©ã€ã³ã§ã¯ããããã³ã°ãšã³ãžã³ã䜿çšããŠè€æ°ã®ç»åã䞊è¡ããŠåŠçã§ããŸããããã«ã¯ããªãµã€ãºããã£ã«ã¿ãŒã®é©çšãç»å圢åŒã®å€æãªã©ãå«ãŸããŸããããã«ãããå€§èŠæš¡ãªç»åããŒã¿ã»ããã®åŠçæéãå€§å¹ ã«ççž®ã§ããŸãã
äŸïŒããŒã¿ããŒã¹æäœã®ãããåŠç
倧éã®ã¬ã³ãŒããããŒã¿ããŒã¹ã«æ¿å ¥ããå ŽåãèããŠã¿ãŸããããã¬ã³ãŒãã1ã€ãã€æ¿å ¥ãã代ããã«ããããåŠçãè¡ãããšã§ããã©ãŒãã³ã¹ãåçã«åäžãããããšãã§ããŸãã
async function insertRecordsInBatches(records, batchSize, db) {
const recordIterator = records[Symbol.iterator]();
const batchedRecordIterator = batchIterator({
next: () => {
const next = recordIterator.next();
return {value: next.value, done: next.done};
}
}, batchSize);
let batchResult = batchedRecordIterator.next();
while (!batchResult.done) {
const batch = batchResult.value;
try {
await db.insertMany(batch);
console.log(`Inserted batch of ${batch.length} records.`);
} catch (error) {
console.error('Error inserting batch:', error);
}
batchResult = batchedRecordIterator.next();
}
console.log('Finished inserting all records.');
}
// Example usage (assuming a MongoDB connection):
async function main() {
const { MongoClient } = require('mongodb');
const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri);
try {
await client.connect();
const db = client.db('mydb');
const collection = db.collection('mycollection');
const records = Array(1000).fill(null).map((_, i) => ({
id: i + 1,
name: `Record ${i + 1}`,
timestamp: new Date()
}));
await insertRecordsInBatches(records, 100, collection);
} catch (e) {
console.error(e);
} finally {
await client.close();
}
}
main();
ãã®äŸã§ã¯ãåæçãªbatchIterator
ã䜿çšããŠã¬ã³ãŒãããããåŠçããinsertMany
ã䜿çšããŠMongoDBããŒã¿ããŒã¹ã«æ¿å
¥ããŸãã
æ£ããã¢ãããŒãã®éžæ
JavaScriptã€ãã¬ãŒã¿ãã«ããŒãããã³ã°ãšã³ãžã³ãå®è£ ããéã«ã¯ã以äžã®èŠçŽ ãèæ ®ããŠãã ããïŒ
- åæ vs. éåæïŒ I/OããŠã³ããªæäœã«ã¯éåæã€ãã¬ãŒã¿ããCPUããŠã³ããªæäœã«ã¯åæã€ãã¬ãŒã¿ãéžæããŸãã
- 䞊è¡åŠçã¬ãã«ïŒ ã·ã¹ãã ãªãœãŒã¹ãšã¿ã¹ã¯ã®æ§è³ªã«åºã¥ããŠäžŠè¡åŠçã¬ãã«ã調æŽããŸãã
- ãšã©ãŒãã³ããªã³ã°ïŒ å ç¢ãªãšã©ãŒãã³ããªã³ã°ãšãªãã©ã€ããžãã¯ãå®è£ ããŸãã
- ããã¯ãã¬ãã·ã£ãŒïŒ ã·ã¹ãã ã®éè² è·ãé²ãããã«ããã¯ãã¬ãã·ã£ãŒãåŠçããŸãã
çµè«
JavaScriptã€ãã¬ãŒã¿ãã«ããŒãããã³ã°ãšã³ãžã³ã¯ãã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ã«ããããããåŠçãæé©åããããã®åŒ·åãªããŒã«ã§ããã€ãã¬ãŒã¿ããžã§ãã¬ãŒã¿ããããã³ã°ããžãã¯ã®ã³ã¢ã³ã³ã»ãããçè§£ããããšã§ãç¹å®ã®ããŒãºã«åãããå¹ççã§å ç¢ãªãšã³ãžã³ãæ§ç¯ã§ããŸããå€§èŠæš¡ãªããŒã¿ã»ããã®åŠçãAPIãªã¯ãšã¹ãã®äœæãè€éãªããŒã¿ãã€ãã©ã€ã³ã®æ§ç¯ãªã©ãã©ã®ãããªå Žåã§ããé©åã«èšèšããããããã³ã°ãšã³ãžã³ã¯ããã©ãŒãã³ã¹ãã¹ã±ãŒã©ããªãã£ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
ãããã®ãã¯ããã¯ãå®è£ ããããšã§ã倧éã®ããŒã¿ãããå¹ççãã€å埩åãæã£ãŠåŠçã§ããJavaScriptã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ãèæ ®ããæè¯ã®çµæãåŸãããã«äžŠè¡åŠçããšã©ãŒãã³ããªã³ã°ãããã¯ãã¬ãã·ã£ãŒã®ããã®é©åãªæŠç¥ãéžæããããšãå¿ããªãã§ãã ããã
ãããªãæ¢æ±
- ããé«åºŠãªã¹ããªãŒã åŠçæ©èœã«ã€ããŠã¯ãRxJSãHighland.jsãªã©ã®ã©ã€ãã©ãªãæ¢æ±ããŠãã ããã
- 忣ãããåŠçã®ããã«ãRabbitMQãKafkaãªã©ã®ã¡ãã»ãŒãžãã¥ãŒã·ã¹ãã ã調æ»ããŠãã ããã
- ããã¯ãã¬ãã·ã£ãŒã¹ãã©ããžãŒãšãããã·ã¹ãã ã®å®å®æ§ã«äžãã圱é¿ã«ã€ããŠèªãã§ãã ããã