LintCode-566: GFS Client (System Design题)

本文介绍了一种模拟大文件分块及组装的方法,重点讨论了如何处理文件大小小于块大小的情况,并提供了一段示例代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这题就是模拟一个大文件的分块和组装。
有一个地方要注意:
当fileSize < chunkSize时,numOfChunk仍然要设为1。
可以用以下技巧:
int numOfChunks = (content.size() + chunkSize - 1) / chunkSize;
也可以用
int numOfChunks = (content.size() - 1) / chunkSize + 1;

/* Definition of BaseGFSClient
 * class BaseGFSClient {
 * private: map<string, string> chunk_list;
 * public:
 *     string readChunk(string& filename, int chunkIndex) {
 *         // Read a chunk from GFS
 *     }
 *     void writeChunk(string& filename, int chunkIndex,
 *                     string& content) {
 *         // Write a chunk to GFS     
 *     }
 *  };
 */


class GFSClient : public BaseGFSClient {
public:

    /*
    * @param chunkSize: An integer
    */
    GFSClient(int chunkSize) {
        this->chunkSize = chunkSize;
    }

    /*
     * @param filename: a file name
     * @return: conetent of the file given from GFS
     */
    string read(string &filename) {

        if (mp.find(filename) == mp.end()) return "";

        int numOfChunks = mp[filename];
        string result;
        for (int i = 0; i < numOfChunks; ++i) {
            result = result + readChunk(filename, i);
        }
        return result;
    }

    /*
     * @param filename: a file name
     * @param content: a string
     * @return: nothing
     */
    void write(string &filename, string &content) {
        //important! Make sure that in the case of fileSize < chunkSize, num = 1;
        int numOfChunks = (content.size() + chunkSize - 1) / chunkSize;
        mp[filename] = numOfChunks;
        for (int i = 0; i < numOfChunks; ++i) {
            string subFile = content.substr(i * chunkSize, chunkSize);
            writeChunk(filename, i, subFile);
        }
    }

private:
    size_t chunkSize;
    map<string, int> mp; //stores filename<->numOfChunks
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值